以下是我執行的SleepConditionVariableCS
,WakeAllConditionVariable
和線程創建函數。問題是,有時當我嘗試創建線程時,創建線程卡在WaitForSingleObject(cv->mut, INFINITE);
的SleepConditionVariableCS
中。我無法弄清楚這裏的競賽狀況。這段代碼中的競態條件是什麼?
typedef struct
{
int waiters_count;
HANDLE sema_;
HANDLE mut;
} CONDITION_VARIABLE;
void SleepConditionVariableCS(CONDITION_VARIABLE *cv, CRITICAL_SECTION *cs, int32_t dwMilliseconds){
WaitForSingleObject(cv->mut, INFINITE); //Acuire object lock
cv->waiters_count++;
LeaveCriticalSection (cs);
if (SignalObjectAndWait(cv->mut, cv->sema_, dwMilliseconds, FALSE) == WAIT_TIMEOUT){ //SignalObjectAndWait releases the lock
cv->waiters_count--;
}
EnterCriticalSection(cs);
}
void WakeAllConditionVariable(CONDITION_VARIABLE *cv){
WaitForSingleObject(cv->mut, INFINITE);
while (cv->waiters_count > 0){
cv->waiters_count = cv->waiters_count - 1;
ReleaseSemaphore (cv->sema_, 1, 0);
}
ReleaseMutex(cv->mut);
}
void KernelThread_CreationWait(void *kthread){
KernelThread *thread = (KernelThread *) kthread;
EnterCriticalSection(thread->lock);
thread->state = Thread_CREATED;
WakeAllConditionVariable(thread->condition_variable);
LeaveCriticalSection(thread->lock);
KernelThread_main(kthread);
}
KernelThread* createKernelThread(){
EventHandler_getHandler();
unsigned long threadid;
int t;
void *hand;
KernelThread *thread = KernelThread_malloc();
EnterCriticalSection(thread->lock);
thread->state = Thread_WAITINGFORCREATION;
hand = CreateThread(NULL,
0, // security, stack size
(LPTHREAD_START_ROUTINE)&KernelThread_CreationWait, // start
(void *)thread,
0,
&threadid); // param, creation flags, id
if (hand == NULL){
printf("ERROR: return handle from CreateThread() is NULL\n");
exit(-1);
}
thread->thread = hand;
thread->thread_id = threadid;
SleepConditionVariableCS(thread->condition_variable,thread->lock,INFINITE);
LeaveCriticalSection(thread->lock);
return thread;
}
void InitializeConditionVariable (CONDITION_VARIABLE *cv){
cv->waiters_count = 0;
cv->sema_ = CreateSemaphore (NULL, // no security
0, // initially 0
0x7fffffff, // max count
NULL); // unnamed
cv->mut = CreateMutex(
NULL, // default security attributes
FALSE, // initially not owned
NULL); // unnamed mutex
}
'''SleepConditionVariableCS'''你叫'''LeaveCriticalSection'''先'''EnterCriticalSection'''第二。氣味 – 2013-04-08 21:12:37
@ user931794我知道,但我獲得了一個不同的鎖('cv-> mut')以彌補差距。這是必要的,因爲我不能同時睡覺和解鎖'CRITICAL_SECTION'。如果您明確知道錯誤的位置,那將會非常有幫助。 – chacham15 2013-04-08 21:15:57
可能是一個愚蠢的問題,但是'thread-> condition_variable'被初始化了嗎? – simonc 2013-04-08 21:17:26