gpt4 book ai didi

c - 2个以上线程的自写互斥锁

转载 作者:太空宇宙 更新时间:2023-11-04 01:25:21 24 4
gpt4 key购买 nike

我已经编写了以下代码,到目前为止,在我的所有测试中,我似乎已经为我的 4 个线程编写了一个有效的 Mutex,但我想听听其他人对我的解决方案有效性的看法。

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);
}

最佳答案

我觉得有必要在这里写一个答案,因为这个问题很好,考虑到它可以帮助其他人理解互斥的一般问题。在你的情况下,你已经走了很长一段路来隐藏这个问题,但你无法避免它。归结为:

01  /* pseudo-code */
02 if (! mutex.isLocked())
03 mutex.lock();

您总是需要在 0203 行之间进行线程切换。所以有一种可能的情况是,两个线程发现 mutex 已解锁并在那之后被中断......只是稍后恢复并单独锁定这个互斥锁。您将有两个线程同时进入临界区。

因此,您绝对需要实现可靠的互斥是一个原子操作,它测试一个条件并同时设置一个值,同时没有任何机会被打断。

01  /* pseudo-code */
02 while (! test_and_lock(mutex));

一旦此test_and_lock 函数无法中断,您的实现就是安全的。直到 , C 没有提供这样的东西,所以 pthreads 的实现需要使用例如程序集或特殊的编译器内在函数。用 ,终于有了一种“标准”的方式来写这样的原子操作,但我不能在这里举个例子,因为我没有那样做的经验。对于一般用途,pthreads 库将为您提供所需的内容。

编辑:当然,这仍然是简化的——在多处理器场景中,您需要确保即使是内存访问也是互斥的。

关于c - 2个以上线程的自写互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32421004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com