【发布时间】:2023-03-24 11:12:01
【问题描述】:
我有两个线程 T1 和 T2,它们试图通过信号量信号进行打印。每个线程打印 10 次,但有时,两者都在 WaitforSingleObject 处被阻塞并且不打印任何内容。 我是不是做错了什么。请告诉我如何解决这个问题并摆脱这个问题。
HANDLE hThreadSemaphore1,hThreadSemaphore2;
void T1(void *param) {
static int i=0;
ReleaseSemaphore(hThreadSemaphore2, 1, NULL);
BOOL success = SetThreadAffinityMask(GetCurrentThread(),1);
_tprintf (_T("SetThreadAffinityMask PAssed: %d\n"), GetLastError());
if(success ==0) {
_tprintf (_T("Setting the Thread Affinity for T1 could not be done\n"));
}
while(i!=10) {
WaitForSingleObject(hThreadSemaphore2,INFINITE);
i++;
printf("Thread 1 is Running %d!\n",i);
ReleaseSemaphore(hThreadSemaphore1, 1, NULL);
}
_endthread();
}
T2:
void T2(void *param) {
static int i=0;
BOOL success = SetThreadAffinityMask(GetCurrentThread(),1);
_tprintf (_T("SetThreadAffinityMask PAssed: %d\n"), GetLastError());
if(success ==0) {
_tprintf (_T("Setting the Thread Affinity for T1 could not be done\n"));
}
while(i!=10) {
WaitForSingleObject(hThreadSemaphore1,INFINITE);
i++;
printf("Thread 2 is Running %d!\n",i);
ReleaseSemaphore(hThreadSemaphore2, 1, NULL);
}
_endthread();
}
主要
int _tmain(int argc, _TCHAR* argv[]) {
unsigned long val1,val2;
HANDLE handle1,handle2;
handle1 = (HANDLE) _beginthreadex(NULL,0, (unsigned int (__stdcall *)(void *))T1,NULL,0,(unsigned int*)&val1); // create thread
char SemName[80];
sprintf(SemName, "ThreadSem_0x%x",val1);
hThreadSemaphore1 = CreateSemaphore(NULL, 0, 5,(LPCWSTR) SemName);
handle2 = (HANDLE) _beginthreadex(NULL,0, (unsigned int (__stdcall *)(void *))T2,NULL,0,(unsigned int*)&val2); // create thread
sprintf(SemName, "ThreadSem_0x%x",val2);
hThreadSemaphore2 = CreateSemaphore(NULL, 0, 5,(LPCWSTR) SemName);
HANDLE process = GetCurrentProcess();
getch();
return 0;
}
【问题讨论】:
-
嗨,对不起,我试图重新格式化代码,但我想我可能搞砸了你的问题......会尝试撤消它!对不起!
-
好吧,我已经纠正了我的错误......
-
@Flup:嘿,flup,所做的编辑不是我的格式……你是同行评审或编辑吗?
-
@Jimbo 我投了赞成票,但其他审阅者没有意识到所有额外代码的来源,所以我回滚到原始版本并清理了它。
-
@Flup。使用这两个信号量使任务以锁步方式运行,因此任务的交错总是1,2,1,2,1,2...当一个在运行时另一个总是在等待
标签: deadlock semaphore waitforsingleobject