如何在Linux上用C在多线程中使用互斥



我怎么能用pthead_create((在C中创建两个线程,但第一个打印'h'和'o',第二个打印'ell',结果是'hello'。我们如何使用pthread_mutex_lock和unlock而不使用任何sleep((来解决这个问题。请帮忙。这就是我所做的,但有时并不像预期的那样奏效。

#include <stdio.h>
#include <pthread.h>
pthread_t th[2];
pthread_mutex_t l1,l2;
void *print1(){
pthread_mutex_lock( &l1 );
printf("h");
pthread_mutex_unlock( &l1 );
pthread_mutex_lock( &l2 );
printf("o");
pthread_mutex_unlock( &l2 );
return NULL;
}
void *print2(){
pthread_mutex_lock( &l2 );
printf("ell");
pthread_mutex_unlock( &l2 );
return NULL;
}
int main(){
pthread_create(&th[0],NULL,print1,NULL);
pthread_create(&th[1],NULL,print2,NULL);
pthread_join(th[0],NULL);
pthread_join(th[1],NULL);
printf("n");
return 0;
} 

互斥提供MUTual EXclusion,而不是排序。您需要添加更多或不同的内容来控制线程之间操作的相对顺序。为此,互斥对象的常见伙伴是条件变量。您可以使用一个互斥、一个条件变量和一个常规共享变量来完成您的工作。或者,一对信号量可以很好、干净地处理你的特定工作。

如果您可以使用的唯一同步对象是互斥对象,那么您可以尝试不使用CV的互斥/CV方法。这里的关键是,无论有没有CV,都要有一个共享变量,以某种方式指示轮到哪个线程。每个线程都试图锁定互斥对象。成功后,线程会检查共享变量,看看是否轮到该线程运行,如果是,它会做适当的工作,然后释放互斥锁。如果线程锁定了互斥锁,发现轮到它的是而不是,那么它就会释放互斥锁并循环回来重试。这里的问题是,线程可能在没有调度的情况下运行不确定的时间,这就是在混合地址中添加条件变量的原因。

最新更新