gpt4 book ai didi

c - 使用传递给线程的 pthread_mutex_t 锁

转载 作者:行者123 更新时间:2023-12-02 08:06:36 24 4
gpt4 key购买 nike

我正在学习 C 中的并发性。我知道有几种方法可以初始化 pthread_mutex_t。

这个简单的程序运行良好:

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

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void* worker(void* arg) {

pthread_mutex_lock(&lock);
printf("worker says hi\n");
pthread_mutex_unlock(&lock);

return NULL;
}

int main(int argc, char *argv[]) {

pthread_t p;
pthread_create(&p, NULL, worker, NULL);

pthread_mutex_lock(&lock);
printf("master says hi\n");
pthread_mutex_unlock(&lock);

pthread_join(p, NULL);

return 0;
}

但是,如果我不想全局定义锁,我想我可以在我的主线程中定义它并将它传递给另一个线程,如下所示:

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

void* worker(void* arg) {
pthread_mutex_t lock = * (pthread_mutex_t *) arg;

pthread_mutex_lock(&lock);
printf("worker says hi\n");
pthread_mutex_unlock(&lock);

return NULL;
}

int main(int argc, char *argv[]) {

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

pthread_t p;
pthread_create(&p, NULL, worker, &lock);

pthread_mutex_lock(&lock);
printf("master says hi\n");
pthread_mutex_unlock(&lock);

pthread_join(p, NULL);

return 0;
}

但是,这有效。相反,它只打印 master says hi 并挂起。

我认为这可能是死锁,所以我在master中插入了一些 sleep 时间如下:

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

void* worker(void* arg) {
pthread_mutex_t lock = * (pthread_mutex_t *) arg;

pthread_mutex_lock(&lock);
printf("worker says hi\n");
pthread_mutex_unlock(&lock);

return NULL;
}

int main(int argc, char *argv[]) {

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

pthread_t p;
pthread_create(&p, NULL, worker, &lock);

sleep(1);

pthread_mutex_lock(&lock);
printf("master says hi\n");
pthread_mutex_unlock(&lock);

pthread_join(p, NULL);

return 0;
}

正如预期的那样,这会打印出 worker says hi,然后在一秒后打印出 master says hi

但是,如果我将 sleep 移动到 worker 中,如下所示,它会再次挂起:

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

void* worker(void* arg) {
pthread_mutex_t lock = * (pthread_mutex_t *) arg;

sleep(1);

pthread_mutex_lock(&lock);
printf("worker says hi\n");
pthread_mutex_unlock(&lock);

return NULL;
}

int main(int argc, char *argv[]) {

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

pthread_t p;
pthread_create(&p, NULL, worker, &lock);

pthread_mutex_lock(&lock);
printf("master says hi\n");
pthread_mutex_unlock(&lock);

pthread_join(p, NULL);

return 0;
}

如果我将 sleep 函数放在上方 pthread_mutex_t lock = * (pthread_mutex_t *) arg; 行,那么它不会挂起。我不确定如何解释这种行为。

最佳答案

worker 函数正在复制互斥锁,而它应该只使用现有的互斥锁。修复方法是将 lock 变量声明为指向互斥量的指针:

void* worker(void* arg) {

pthread_mutex_t *lock = arg;

pthread_mutex_lock(lock);
printf("worker says hi\n");
pthread_mutex_unlock(lock);

return NULL;
}

关于c - 使用传递给线程的 pthread_mutex_t 锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50827719/

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