为什么睡眠功能会禁用我的互斥锁
Why does Sleep function disable my Mutex
我在网上找到了显示如何使用 redKyle 教程中的线程的代码。 在"竞争条件"教程中,他基本上展示了如何将两个线程发送到一个函数。 该函数的目标是按顺序打印"."和"#",各打印一百次。 他提供代码来使其工作,他不提供互斥锁的代码。 我已经修改了代码以包含互斥锁,以防止一个线程访问保存最后一个字符的变量,而另一个线程正在访问它。我让代码工作。伟大!但是,我一直在 1 到 50 之间更改睡眠值。 互斥代码工作正常。但是,当我将睡眠设置为 0(或只是注释掉)时,互斥锁不再起作用,并且值不再以正确的方式打印(我不再看到 200 个字符严格交替的"#"和".")。
以下是代码:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
static char lastChar='#';
//define a mutex
HANDLE mutexHandle = NULL;
//flag to specify if thread has begun
bool threadStarted = false;
void threadProc(int *sleepVal, int *threadID)
{
cout<<"sleepVal: "<<*sleepVal<<endl;
for (int i=0; i<100; i++)
{
char currentChar;
threadStarted = true;
while(!threadStarted){}
//lock mutex
WaitForSingleObject(mutexHandle, INFINITE);
if (lastChar == '#')
currentChar = '.';
else
currentChar = '#';
Sleep(*sleepVal);
lastChar = currentChar;
ReleaseMutex(mutexHandle);
threadStarted = false;
// cout<<"nSleepVal: "<<*sleepVal<<" at: "<<currentChar;
cout<<currentChar;
}//end for
}//end threadProc
int main()
{
cout<<"Race conditions by redKlyde n";
int sleepVal1 = 50;
int sleepVal2 = 30;
//create mutex
mutexHandle = CreateMutex(NULL, false, NULL);
//create thread1
HANDLE threadHandle;
threadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) threadProc, &sleepVal1, 0, NULL);
//create thread2
HANDLE threadHandle2;
threadHandle2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) threadProc, &sleepVal2, 0, NULL);
WaitForSingleObject(threadHandle, INFINITE);
WaitForSingleObject(threadHandle2, INFINITE);
cout<<endl<<endl;
CloseHandle(mutexHandle);
system("pause");
return 0;
}
所以我的问题是:为什么将睡眠设置为 0 会使互斥代码无效。
请注意,您的 print 语句不受互斥锁保护,因此一个线程可以自由打印,而另一个线程可以自由修改。通过不休眠,您可以允许调度程序根据线程的量程确定打印顺序。
有些地方不对劲:
1)你不应该睡在有锁的锁里。这几乎永远不正确。2)您的数据被共享的任何地方,您都应该用锁保护。这意味着打印语句也应该在锁中。
此外,作为将来使用互斥的提示,在Windows上,最好的用户模式互斥锁是SRWLock,然后是CriticalSection。 使用基于句柄的同步对象要慢得多。
相关文章:
- 询问在设计我的手臂模拟器功能表示格式1
- 反向功能超出了我的 cpp 程序的范围
- 为什么我的功能在使用 goto 时会给我带来"expected primary-expression before '}' token"?
- 访问我以前可以访问的功能时出现分段错误
- 为什么我的打印功能不起作用?链表
- C //尝试重写一个工作代码以包括我的功能
- 尽管我的功能和cout语句的放置错误,但我的程序为什么会起作用
- 在我的功能中添加IF语句
- 为什么VS2017拒绝我的功能模板专业化,而不是VS2015拒绝
- 对我的功能的未定义引用
- 我的功能跳过C 中的循环参数
- 为什么Clang自动将属性添加到我的功能中
- 在这种情况下,(N)RVO是否适用于我的功能
- 返回语句打破我的功能C
- 我的功能似乎是正确的,但我会收到编译错误
- 为什么我的功能(在二进制树上)打印出意外的结果
- 如何阻止编译器删除我的功能
- 如何使我的功能通过大多数频繁以及如何处理空间来组织?C
- 消除对Boost ::的需求,以绑定我的功能
- visual studio 2010 - c++ DLL不导出我的功能