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

时间:2018-12-10 20:35:34

标签: c linux mutex

我如何使用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;
} 

1 个答案:

答案 0 :(得分:2)

互斥提供互斥,而不是顺序。您需要添加更多或不同的东西来控制线程之间的相对操作顺序。为此,互斥锁的通常伴侣是条件变量。您可以使用一个互斥锁,一个条件变量和一个常规共享变量来完成您的工作。另外,一对信号量可以很好地处理您的特定工作。

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