我对在 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
函数的末尾。
您需要重新组织代码以获得您想要的输出。
但是,要获得这样的结果,您应该检查同步系统,例如 semaphores或 condition 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;
}
我是一名优秀的程序员,十分优秀!