gpt4 book ai didi

multithreading - 互斥锁死锁,条件变量代码?

转载 作者:行者123 更新时间:2023-12-03 13:19:23 29 4
gpt4 key购买 nike

我正在阅读AS TANENBAUM撰写的《现代操作系统》一书,它给出了一个解释条件变量的示例,如下所示。在我看来,这是一个僵局,不确定我想念什么。

让我们假设使用者线程首先启动。在the_mutex被锁定之后,使用者线程被阻塞,等待条件变量condc。

如果生产者此时正在运行,则the_mutex仍将被锁定,因为使用者从不释放它。因此生产者也将被封锁。

在我看来,这是一个教科书的僵局问题。我在这里想念什么吗?谢谢

#include <stdio.h>
#include <pthread.h>

#define MAX 10000000000 /* Numbers to produce */
pthread_mutex_t the_mutex;
pthread_cond_t condc, condp;
int buffer = 0;


void* consumer(void *ptr) {
int i;

for (i = 1; i <= MAX; i++) {
pthread_mutex_lock(&the_mutex); /* lock mutex */

/*thread is blocked waiting for condc */
while (buffer == 0) pthread_cond_wait(&condc, &the_mutex);
buffer = 0;
pthread_cond_signal(&condp);
pthread_mutex_unlock(&the_mutex);
}
pthread_exit(0);
}

void* producer(void *ptr) {
int i;

for (i = 1; i <= MAX; i++) {
pthread_mutex_lock(&the_mutex); /* Lock mutex */

while (buffer != 0) pthread_cond_wait(&condp, &the_mutex);
buffer = i;
pthread_cond_signal(&condc);
pthread_mutex_unlock(&the_mutex);
}
pthread_exit(0);
}

int main(int argc, char **argv) {
pthread_t pro, con;

//Simplified main function, ignores init and destroy for simplicity
// Create the threads
pthread_create(&con, NULL, consumer, NULL);
pthread_create(&pro, NULL, producer, NULL);
}

最佳答案

当您等待条件变量时,在等待期间将释放关联的互斥锁(这就是为什么将互斥锁传递给pthread_cond_wait的原因)。

当pthread_cond_wait返回时,互斥锁始终始终被锁定。

牢记这一点,您可以遵循示例的逻辑。

关于multithreading - 互斥锁死锁,条件变量代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38600689/

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