如何使用互斥锁同步多线程?

时间:2016-02-04 07:26:53

标签: c linux multithreading pthreads mutex

我是学习者,试图建立多线程编程的知识。特别是,我想了解如何将互斥锁与pthreads一起使用。

web.config

我创建了两个线程,现在我正在尝试同步它们。我应该在哪里使用两个互斥锁进行锁定和解锁?

我想这样输出:

#include<stdio.h>
#include<pthread.h>
pthread_mutex_t x,y;
static int p=0;
void print(char *x)
{
        p++;
        printf("%d ------ %s\n",p,x);
}
void * thread_1(char *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
                print(m);
        }
}

void * thread_2(char *m)
{
        int i;
        sleep(1);
        for(i=1;i<=10;i++)
        {
                print(m);
        }

}
int main()
{

        pthread_t t1;
        pthread_t t2;
        pthread_mutex_init(&y,NULL);
        pthread_mutex_init(&x,NULL);
        pthread_create(&t1,NULL,thread_1,"thread_1");
        pthread_create(&t2,NULL,thread_2,"thread_2");

        while(1);
}

1 个答案:

答案 0 :(得分:3)

这当然可以使用互斥锁来完成,但是一对信号量更适合此任务。使用两个信号量,每个信号量与一个线程相关联,该线程发布到另一个线程以通知其轮流。 请注意,线程函数需要void*,而不是char*

void * thread_1(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
                sem_wait(&sem2);
                print(m);
                sem_post(&sem1);
        }
}

void * thread_2(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
                sem_wait(&sem1);
                print(m);
                sem_post(&sem2);
        }
}

int main(void) {
 ...
 sem_init(&sem1, 0, 0);
 sem_init(&sem2, 0, 1);
 ...
}

sleep()电话是不必要的。你也不需要在main()线程中有一个无限循环。如果您希望完成线程,请使用pthread_join()。或者只需拨打pthread_exit(0);而不是while(1);

使用互斥和条件变量对,它们在线程之间交替使用另一个变量来通知转弯。基本上与上面的逻辑相同,但对于此任务来说有点“沉重”。我不确定为什么你“必须”使用互斥锁:(

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int turn = 0;

void print(char *x)
{
        p++;
        printf("%d ------ %s\n",p,x);
}
void * thread_1(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
           pthread_mutex_lock(&mutex);
           while (turn != 0)
              pthread_cond_wait(&cond, &mutex);
           print(m);
           turn = 1;
           pthread_cond_signal(&cond);
           pthread_mutex_unlock(&mutex);
        }
}

void * thread_2(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
            pthread_mutex_lock(&mutex);
            while (turn != 1)
               pthread_cond_wait(&cond, &mutex);
            print(m);
            turn = 0;
            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&mutex);
        }
}