2011-09-25 94 views
0

我有互斥 我有這樣的代碼,我不知道爲什麼它不能正常工作的問題...互斥問題

#include <windows.h> 
#include <process.h> 
#include <stdio.h> 
HANDLE mutex; 
unsigned _stdcall t(void*){ 
printf(":D:D:D\n"); 
return NULL; 
} 
int main(){ 
mutex=CreateMutex(NULL,FALSE,NULL); 
WaitForSingleObject(mutex,INFINITE); 
_beginthreadex(NULL,NULL,&t,NULL,0,NULL); 
WaitForSingleObject(mutex,INFINITE); 
printf("HD\n"); 
} 

結果是:

HD 
:D:D:D 

我不希望看到在控制檯HD .....

但是這個代碼正常工作

HANDLE mutex; 
unsigned _stdcall t(void*){ 
WaitForSingleObject(mutex,INFINITE); 
printf(":D:D:D\n"); 
ReleaseMutex(mutex); 
return NULL; 
} 
int main(){ 
mutex=CreateMutex(NULL,FALSE,NULL); 
WaitForSingleObject(mutex,INFINITE); 
_beginthreadex(NULL,NULL,&t,NULL,0,NULL); 
printf("HD\n"); 
while(1){ 
} 

} 

結果是:

HD 

謝謝大家....

+4

請經常檢查WaitForSingleObject和其他核心函數的返回值。如果不這樣做,您將永遠無法調試自己的代碼。 – Mat

回答

6

MSDN

擁有互斥可以指定反覆等待功能相同的互斥體的線程調用而不會阻止其執行。

因此,在您的第一個示例中,第二次調用WaitForSingleObject()不會阻塞主線程,因爲它是擁有該互斥量的線程。

+0

有任何建議,可以在這種情況下工作?我的意思是一個例子... – pooya

+0

@pooya:你想達到什麼?如果它只是不打印「HD」,我只是不打印它 - 你已經知道你擁有互斥鎖(給予適當的返回值檢查)。 –

+0

我想在opengl程序中使用這個互斥體... – pooya

5

它看起來像你想主線程代表輔助線程採取互斥體。互斥體是通過線程跟蹤的,因此您不能代表其他人進行互斥。您可能想切換到沒有所有者跟蹤的信號燈。

0

您使用了不當的互斥鎖:當您等待互斥鎖時,您會阻止,直到其他人釋放它。

線程過程必須在主線程中執行自己的鎖/解鎖(Windows中的WaitForSingleObject和ReleaseMutex)。 目的是避免一個線程將輸出與另一個線程交錯。

如果你想「加入」一個線程(終止後做一些事情),你也可以等待它。

HANDLE mutex; 

unsigned _stdcall t(void*) 
{ 
    WaitForSingleObject(mutex,INFINITE); 
    printf(":D:D:D\n"); 
    ReleaseMutex(mutex); 
    return NULL; 
} 

int main() 
{ 
    mutex=CreateMutex(NULL,FALSE,NULL); 
    _beginthreadex(NULL,NULL,&t,NULL,0,NULL); 
    Sleep(0); 
    WaitForSingleObject(mutex,INFINITE); 
    printf("HD\n"); 
    ReleaseMutex(mutex); 
} 

另外:不要使用無限循環卡住線程(while(1) ...),使用Sleep代替。

另請注意,通常情況下,您無法預測首先將打印哪個線程。這就是併發性:線程互相競爭並行運行。互斥體避免它們一起輸出,但是會產生什麼序列還取決於系統在運行程序時還在做什麼。