tri*_*san 1 windows winapi mutex waitformultipleobjects visual-c++
我希望以随机顺序从0到4得到数字,但相反,我有一些不同步的混乱
我做错了什么?
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
void addQuery(void *v );
HANDLE ghMutex;
int main()
{
HANDLE hs[5];
ghMutex = CreateMutex( NULL, FALSE, NULL);
for(int i=0; i<5; ++i)
{
hs[i] = (HANDLE)_beginthread(addQuery, 0, (void *)&i);
if (hs[i] == NULL)
{
printf("error\n"); return -1;
}
}
printf("WaitForMultipleObjects return: %d error: %d\n",
(DWORD)WaitForMultipleObjects(5, hs, TRUE, INFINITE), GetLastError());
return 0;
}
void addQuery(void *v )
{
int t = *((int*)v);
WaitForSingleObject(ghMutex, INFINITE);
cout << t << endl;
ReleaseMutex(ghMutex);
_endthread();
}
Run Code Online (Sandbox Code Playgroud)
您必须在锁内读取和写入共享变量.您正在锁定之外读取它,从而使锁定无关紧要.
但即使这还不够,因为你的共享变量是一个循环变量,你正在编写而没有保护锁.一个更好的例子会像这样运行:
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
void addQuery(void *v );
HANDLE ghMutex;
int counter = 0;
int main()
{
HANDLE hs[5];
ghMutex = CreateMutex( NULL, FALSE, NULL);
for(int i=0; i<5; ++i)
{
hs[i] = (HANDLE)_beginthread(addQuery, 0, NULL);
if (hs[i] == NULL)
{
printf("error\n"); return -1;
}
}
printf("WaitForMultipleObjects return: %d error: %d\n",
(DWORD)WaitForMultipleObjects(5, hs, TRUE, INFINITE), GetLastError());
return 0;
}
void addQuery(void *v)
{
WaitForSingleObject(ghMutex, INFINITE);
cout << counter << endl;
counter++;
ReleaseMutex(ghMutex);
_endthread();
}
Run Code Online (Sandbox Code Playgroud)
如果可以,请使用临界区而不是互斥锁,因为它们使用起来更简单,效率更高.但它们具有相同的语义,因为它们只保护锁定块内的代码.
注意:Jerry指出了其他一些问题,但我专注于高级别的trheading和序列化问题.