我寫了下面的代碼,到目前爲止在我所有的測試中,似乎我已經爲我的4個線程編寫了一個可用的互斥鎖,但我希望得到其他人的意見我的解決方案的有效性。2+線程的自寫互斥
typedef struct Mutex{
int turn;
int * waiting;
int num_processes;
} Mutex;
void enterLock(Mutex * lock, int id){
int i;
for(i = 0; i < lock->num_processes; i++){
lock->waiting[id] = 1;
if (i != id && lock->waiting[i])
i = -1;
lock->waiting[id] = 0;
}
printf("ID %d Entered\n",id);
}
void leaveLock(Mutex * lock, int id){
printf("ID %d Left\n",id);
lock->waiting[id] = 0;
}
void foo(Muted * lock, int id){
enterLock(lock,id);
// do stuff now that i have access
leaveLock(lock,id);
}
這段代碼是不完整的,但(或可怕的錯誤).. Mutex.waiting從不指着某處定義。除此之外,試圖將自己的原子基元寫在非原子的東西上C提供的絕對是一個壞主意,它只是很多工作(但總是可行的)來證明它可能出錯的地方。 [關鍵就是找到一個隨機的線程切換最容易出問題的點] –
添加到我的評論...可靠的代碼,請改用'pthread_mutex_t' ...實現可能會有所不同,但你永遠也找不到依據的實現在「純粹」C上,因爲它總是需要一些原子基元。 –
據我所見,在線程A已經進入之後,線程A離開它之前,什麼都不能阻止線程B進入相同的互斥體。無論是鎖定還是解鎖,互斥鎖的狀態都是相同的。 – regular