【发布时间】:2019-09-29 23:05:43
【问题描述】:
您好,我想同步两个线程,一个增加一个变量,另一个减少一个变量。 我想要的结果如下:
Thread #0 j = 1
Thread #1 j = 0
Thread #0 j = 1
Thread #1 j = 0
等等.. 但我的代码有时会这样工作,在某些情况下它会打印出非常奇怪的值。我想我在某处有一些未定义的行为,但我无法弄清楚到底发生了什么。
我的代码包含在一个 HANDLE ghMutex 中,其中包含我的互斥锁的处理程序:
我的主要功能:
int main(void)
{
HANDLE aThread[THREADCOUNT];
ghMutex = CreateMutex(NULL, FALSE, NULL);
aThread[0] = (HANDLE)_beginthreadex(NULL, 0, &inc, NULL, CREATE_SUSPENDED, 0);
aThread[1] = (HANDLE)_beginthreadex(NULL, 0, &dec, NULL, CREATE_SUSPENDED, 0);
ResumeThread(aThread[0]);
ResumeThread(aThread[1]);
WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);
printf("j = %d\n", j);
for (int i = 0; i < THREADCOUNT; i++)
CloseHandle(aThread[i]);
CloseHandle(ghMutex);
return 0;
}
公司功能:
unsigned int __stdcall inc(LPVOID)
{
for (volatile int i = 0; i < MAX; ++i)
{
WaitForSingleObject(
ghMutex, // handle to mutex
INFINITE); // no time-out interval
j++;
printf("Thread %d j = %d\n", GetCurrentThreadId(), j);
ReleaseMutex(ghMutex);
}
_endthread();
return TRUE;
}
十进制函数:
unsigned int __stdcall dec(void*)
{
for (volatile int i = 0; i < MAX; ++i)
{
WaitForSingleObject(
ghMutex, // handle to mutex
INFINITE); // no time-out interval
j--;
printf("Thread %d j = %d\n", GetCurrentThreadId(), j);
ReleaseMutex(ghMutex);
}
_endthread();
return TRUE;
}
我需要一个标准 c++98 中的 win api 解决方案。
【问题讨论】:
-
为此您需要 2 个事件 (0,1)。每个线程 (i) 信号事件 (1-i) 并等待事件 (i)。说
SignalObjectAndWait这里很有用。在 win 8.1 之前是 object eventpair - 它非常适合此类任务,但由于未知原因,它已从 Windows 中删除 -
声明局部变量为volatile,只能从单线程访问——没有任何意义
标签: c++ windows multithreading winapi c++98