c – 如何使用互斥锁严格交替使用两个线程?
发布时间:2020-12-16 10:20:32 所属栏目:百科 来源:网络整理
导读:我需要创建两个严格交替的线程.这是我使用的示例代码: #include Windows.h#include iostreamusing std::cout;using std::endl;HANDLE g_hMutex1;HANDLE g_hMutex2;DWORD WINAPI ThreadFunc1(LPVOID lpParam);DWORD WINAPI ThreadFunc2(LPVOID lpParam);int
我需要创建两个严格交替的线程.这是我使用的示例代码:
#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,NULL); pThreadHandles[0] = CreateThread( NULL,ThreadFunc1,static_cast<void*>(&nCalcNumber),&dwThreadId); pThreadHandles[1] = CreateThread( NULL,ThreadFunc2,&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 应该添加什么来获得所需的结果.我可以使用第二个互斥锁吗? 解决方法
如果你可以使用信号量:你可以使用信号量而不是互斥量,它很容易使用相同的互斥量.
这段代码工作正常: #include <windows.h> #include <iostream> using std::cout; using std::endl; PHANDLE sem1; PHANDLE sem2; DWORD WINAPI ThreadFunc1(LPVOID lpParam); DWORD WINAPI ThreadFunc2(LPVOID lpParam); int main(void) { int nCalcNumber = 10; DWORD dwThreadId; HANDLE pThreadHandles[2]; sem1 = (PHANDLE) CreateSemaphore(NULL,1,NULL); sem2 = (PHANDLE) CreateSemaphore(NULL,NULL); pThreadHandles[0] = CreateThread( NULL,static_cast<void*> (&nCalcNumber),&dwThreadId); pThreadHandles[1] = CreateThread( NULL,INFINITE); CloseHandle(pThreadHandles[0]); CloseHandle(pThreadHandles[1]); CloseHandle(sem1); CloseHandle(sem2); return 0; } DWORD WINAPI ThreadFunc1(LPVOID lpParam) { int* nCalcNumber = static_cast<int*> (lpParam); for (int i = 0; i < *nCalcNumber; i++) { WaitForSingleObject(sem1,INFINITE); cout << "Func 1" << endl; ReleaseSemaphore(sem2,NULL); } return 0; } DWORD WINAPI ThreadFunc2(LPVOID lpParam) { int* nCalcNumber = static_cast<int*> (lpParam); for (int i = 0; i < *nCalcNumber; i++) { WaitForSingleObject(sem2,INFINITE); cout << "Func 2" << endl; ReleaseSemaphore(sem1,NULL); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |