【发布时间】:2015-09-06 07:15:03
【问题描述】:
我已经编写了以下代码,到目前为止,在我的所有测试中,似乎我已经为我的 4 个线程编写了一个工作互斥锁,但我想就我的解决方案的有效性征求其他人的意见。
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的实现,因为它总是需要一些原子原语。 -
据我所知,没有什么能阻止线程 B 在线程 A 已经进入它之后和线程 A 离开它之前进入同一个互斥锁。 Mutex的状态无论是锁定还是解锁都是一样的。
-
据我所知,
for-loop 中的 nothing 符合可见的副作用,因此编译器可以随意重新排序访问。你怎么可能听说过mutex,却对原子性一无所知? -
好的@AndrewGrant——然后阅读原子操作。例如,您需要一条汇编指令来测试内存位置的值,同时尽可能修改它(不可中断)。 C 没有给你那个。
标签: c multithreading pthreads posix mutex