【发布时间】:2011-10-30 08:34:55
【问题描述】:
我需要创建两个严格交替的线程。这是我使用的示例代码:
#include <Windows.h>
#include <iostream>
using std::cout;
using std::endl;
HANDLE g_hMutex1;
HANDLE g_hMutex2;
DWORD WINAPI ThreadFunc1(LPVOID lpParam);
DWORD WINAPI ThreadFunc2(LPVOID lpParam);
int main(void)
{
int nCalcNumber = 10;
DWORD dwThreadId;
HANDLE pThreadHandles[2];
g_hMutex1 = CreateMutex(NULL, FALSE, NULL);
g_hMutex1 = CreateMutex(NULL, FALSE, NULL);
pThreadHandles[0] = CreateThread(
NULL,
0,
ThreadFunc1,
static_cast<void*>(&nCalcNumber),
0,
&dwThreadId);
pThreadHandles[1] = CreateThread(
NULL,
0,
ThreadFunc2,
static_cast<void*>(&nCalcNumber),
0,
&dwThreadId);
WaitForMultipleObjects(2, pThreadHandles, TRUE, INFINITE);
CloseHandle(pThreadHandles[0]);
CloseHandle(pThreadHandles[1]);
CloseHandle(g_hMutex1);
CloseHandle(g_hMutex2);
return 0;
}
DWORD WINAPI ThreadFunc1(LPVOID lpParam)
{
int* nCalcNumber = static_cast<int*>(lpParam);
for (int i = 0; i < *nCalcNumber; i++)
{
WaitForSingleObject(g_hMutex1, INFINITE);
cout << "Func 1" << endl;
ReleaseMutex(g_hMutex1);
}
return 0;
}
DWORD WINAPI ThreadFunc2(LPVOID lpParam)
{
int* nCalcNumber = static_cast<int*>(lpParam);
for (int i = 0; i < *nCalcNumber; i++)
{
WaitForSingleObject(g_hMutex1, INFINITE);
cout << "Func 2" << endl;
ReleaseMutex(g_hMutex1);
}
return 0;
}
我期望收到的结果:
Func 1
Func 2
Func 1
Func 2
Func 1
Func 2
...and so one
应该添加什么以获得所需的结果。我可以使用第二个互斥锁吗?
【问题讨论】:
-
你目前的结果是什么?以及为什么要这样做,因为这会破坏多线程的整个目的。这是作业吗?
-
我想说你这里根本不需要线程......
-
您声明了两个互斥量句柄,1 和 2,然后在 1 处创建了两个互斥量,因此泄漏了一个互斥量。然后两个线程获取/释放相同的互斥锁 1。
-
我同意@DanielMošmondor。如果你需要严格的交替,为什么不使用 Fibers(如果你真的需要两个不同的堆栈),或者两个函数相互让步?
-
@Merlyn Morgan-Graham,这不是家庭作业。这是我自学的下一个阶段。我在工作中通常使用 C#,现在我想学习 C++。
标签: c++ multithreading winapi