如何在C中使用mutex进行多线程?

时间:2016-12-19 07:45:11

标签: c multithreading mutex

我在4个线程中处理了4个被称为A,B,C,D的处理,他们打印了他们的名字。我想使用互斥来处理A,B,C,D按顺序A,B,C,D运行。这是我的代码,但它不能像我想的那样工作。他们如何工作?

#include <stdio.h>
#include <pthread.h>

void processA();
void processB();
void processC();
void processD();

pthread_mutex_t mutex;

void main(){
    pthread_t thread1;
    pthread_t thread2;
    pthread_t thread3;
    pthread_t thread4;

    pthread_mutex_init(&mutex,NULL);

    pthread_create(&thread1, NULL, (void *)&processA,NULL);
    pthread_create(&thread2, NULL, (void *)&processB,NULL);
    pthread_create(&thread3, NULL, (void *)&processC,NULL);
    pthread_create(&thread4, NULL, (void *)&processD,NULL);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    pthread_join(thread3, NULL);
    pthread_join(thread4, NULL);            

    pthread_mutex_destroy(&mutex);
}
void processA()
{
    while (1)
    {
        pthread_mutex_lock(&mutex);
        printf("A \n");
        pthread_mutex_unlock(&mutex);
    }
}
void processB()
{
    while (1)
    {
        pthread_mutex_lock(&mutex);
        printf("B \n");
        pthread_mutex_unlock(&mutex);
    }
}
void processC()
{
    while (1)
    {
        pthread_mutex_lock(&mutex);
        printf("C \n");
        pthread_mutex_unlock(&mutex);
    }
}
void processD()
{
pthread_mutex_lock(&mutex);
    while (1)
    {
        pthread_mutex_lock(&mutex);
        printf("D \n");
        pthread_mutex_unlock(&mutex);
    }
}

2 个答案:

答案 0 :(得分:1)

mutex用于在某些上下文中创建互斥。例如,如果一个线程一次应该有一个对象,则可以使用mutex

您应该使用3 semaphores来实现此类功能。你可以说:

//semaphore1 = up, semaphore2 = up, semaphore3 = up
//Thread A
    //wait for semaphore1 is up
        //work
        //make semaphore1 down
//Thread B
    //wait for semaphore1 is down
        //work
        //make semaphore2 down    
//Thread C
    //wait for semaphore2 is down
        //work
        //make semaphore3 down    
//Thread D
    //wait for semaphore3 is down
        //work

答案 1 :(得分:0)

这就是您的操作方式,您只需对互变量(此例中为f)使用互斥锁,并使用pthread条件信号来触发每秒一个线程的动作。所有线程都获得信号,但是只有一个线程可以访问互斥体。

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/time.h>
#include <stdlib.h>
#include <memory.h>
#include <stdarg.h>
#include <pthread.h>

pthread_mutex_t v1 = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t v2 = PTHREAD_COND_INITIALIZER;

int f = 0;
void *processA(){
        while(1){
        pthread_mutex_lock(&v1);
        pthread_cond_wait(&v2,&v1);
        printf("A,%d\n",f);
        f++;
        pthread_mutex_unlock(&v1);
        }
        return NULL;
}

void *processB(){
        while(1){
        pthread_mutex_lock(&v1);
        pthread_cond_wait(&v2,&v1);
       printf("B,%d\n",f);
        f++;
        pthread_mutex_unlock(&v1);
        }
        return NULL;
}

void *processC(){
        while(1){
        pthread_mutex_lock(&v1);
        pthread_cond_wait(&v2,&v1);
        printf("C,%d\n",f);
        f++;
        pthread_mutex_unlock(&v1);
        }
void main(){

        pthread_t *h;
        int i,ptnum = 3;
        h = malloc(sizeof(pthread_t)*ptnum);
        pthread_create(&h[0],NULL,processA,NULL);
        pthread_create(&h[1],NULL,processB,NULL);
        pthread_create(&h[2],NULL,processC,NULL);
        while(f<=30){
        pthread_cond_signal(&v2);
        sleep(1);
        }
        pthread_mutex_lock(&v1);
        printf("Main Mutex\n");
        for(i=0;i<ptnum;i++){
                pthread_join(&h[i],PTHREAD_CANCELED);
        }
        pthread_mutex_unlock(&v1);
        return NULL;
}