gpt4 book ai didi

c - 如何在 C 语言中使用互斥锁

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

我对在 C 中使用多个互斥锁感到困惑。

int main() {

pthread_t thread1;
char *message1 = "Thread 1";
int r;
pthread_mutex_init(&mutex1, NULL);
pthread_mutex_init(&mutex2, NULL);

pthread_mutex_lock(&mutex1);

r = pthread_create( &thread1, NULL, print_message_function, (void*) message1);

printf("Parent 1\n");


pthread_mutex_lock(&mutex2);
printf("Parent 2\n");
pthread_mutex_unlock(&mutex2);


pthread_mutex_unlock(&mutex1);


pthread_join( thread1, NULL);

printf("Thread 1 returns: %d\n",r);
return 0;
}

void *print_message_function( void *str ) {

pthread_mutex_lock(&mutex1);
char *message;
message = (char *) str;
printf("Child 1 received message: %s \n", message);


pthread_mutex_lock(&mutex2);
printf("child 2\n");
pthread_mutex_unlock(&mutex2);




pthread_mutex_unlock(&mutex1);

return NULL;
}

输出是

Parent 1
Parent 2
Child 1 received message: Thread 1
child 2
Thread 1 returns: 0

我想要的是

Parent 1
Child 1 received message: Thread 1
Parent 2
child 2
Thread 1 returns: 0

最佳答案

当您调用 pthread_create 时,您已经锁定了 mutex1。这意味着调用 pthread_mutex_lock(&mutex1); 的所有其他线程都将等待互斥体解锁。这就是创建第二个线程时发生的情况:mutex1 已经被锁定,因此第二个线程无法进入临界区,需要等待互斥锁解锁。这发生在 main 函数的末尾。

您需要重新组织代码以获得您想要的输出。

但是,要获得这样的结果,您应该检查同步系统,例如 semaphorescondition variables ;它们将提供更清晰、更简单的线程同步方式。
您也可以查看此教程:POSIX Threads Programming


使用信号量的简单解决方案(未测试,但应该有效):

#include <stdio.h>
#include <semaphore.h>

sem_t sem1, sem2;

void* f(void* str) {

sem_wait(&sem1);
printf("Child 1 received message: %s \n",(char*)str);

sem_post(&sem2);
sem_wait(&sem1);

printf("Child 2\n");

return NULL;
}



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

pthread_t thread;
char* message = "Thread 1";

int r;

sem_init(&sem1,0,0);
sem_init(&sem2,0,0);

r = pthread_create(&thread, NULL, f, (void*)message);
sem_post(&sem1);
sem_wait(&sem2);

printf("Parent 2\n");

sem_post(&sem1);

pthread_join(thread1, NULL);
printf("Thread 1 returns: %d\n",r);

return 0;
}

关于c - 如何在 C 语言中使用互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7303372/

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