【问题标题】:Sometimes out of 5 times, 2-3 times, Threads gets deadlock in waitforsingleobject有时 5 次,2-3 次,线程在 waitforsingleobject 中出现死锁
【发布时间】: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


【解决方案1】:

我认为您需要在创建(和运行)线程之前创建两个信号量。我假设_beginthreadex 立即启动线程运行...

如果您检查信号量获取和给出的返回码,在它死锁的运行中,您是否会返回错误?我认为线程可能在创建所有信号量之前就已经开始了......

【讨论】:

  • 谢谢,我在创建线程之前创建了信号量。似乎它现在工作正常。我一直尝试运行它 10 次,输出是从线程中打印出来的。非常感谢 Jimbo 让代码更具可读性并给出了答案。
  • @Gilly:嗨,Gilly,如果它对你有用,你能接受吗?干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多