我如何使用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;
}
答案 0 :(得分:2)
互斥提供互斥,而不是顺序。您需要添加更多或不同的东西来控制线程之间的相对操作顺序。为此,互斥锁的通常伴侣是条件变量。您可以使用一个互斥锁,一个条件变量和一个常规共享变量来完成您的工作。另外,一对信号量可以很好地处理您的特定工作。
如果唯一可以使用的同步对象是互斥锁,则可以尝试不使用CV的互斥锁/ CV方法。无论有没有CV,这里的关键是要有一个共享变量,以某种方式表明它是哪个线程。每个线程都尝试锁定互斥锁。成功执行后,线程将检查共享变量,以查看是否该轮到该线程运行了;如果是,它将执行适当的工作,然后释放互斥量。如果某个线程锁定了互斥锁,并发现轮到了不是,则它释放互斥锁并循环返回以重试。这里的问题是,线程可能会在不确定的时间里不被调度,这就是在混合地址中添加条件变量的原因。