我写了下面的代码,到目前为止在我所有的测试中,似乎我已经为我的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