在线程

时间:2015-10-18 14:55:08

标签: c multithreading pthreads mutex

我编写了以下程序来在POSIX中实现两个线程。有一个全局共享变量sum,它可以同时由两个不同的线程访问。我在访问共享变量时使用了互斥锁和解锁每个线程。我有个问题。这里我在两个线程中使用了相同的互斥锁(pthread_mutex_lock(&mutex))。如果我在pthread_mutex_lock(&mutex)中的thread1pthread_mutex_lock(&mutex1)中的线程(例如thread2)内使用两个不同的互斥锁和解锁,会发生什么?我已经在代码中评论了混淆线。

我的示例代码片段:

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex1=PTHREAD_MUTEX_INITIALIZER;
int sum=0;
void * threadFunc1(void * arg)
{
    int i;
    for(i=1;i<100;i++)
    {
        printf("%s\n",(char*)arg);
        pthread_mutex_lock(&mutex)
        sum++;
        pthread_mutex_unlock(&mutex)
        sleep(1);
    }
}

void * threadFunc2(void * arg)
{
    int i;
    for(i=1;i<100;i++)
    {
            printf("%s\n",(char*)arg);
            pthread_mutex_lock(&mutex)  //what will happen if I use mutex1 here
            sum--;
            pthread_mutex_lock(&mutex)  //what will happen if I use mutex1 here
            sleep(1);
    }
}


int main(void)
{   
    pthread_t thread1;
    pthread_t thread2;


    char * message1 = "i am thread 1";
    char * message2 = "i am thread 2";  

    pthread_create(&thread1,NULL,threadFunc1,(void*)message1 );
    pthread_create(&thread2,NULL,threadFunc2,(void*)message2 );

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

    return 0;

}

在访问共享变量时,使用相同的互斥锁和不同的互斥锁之间的基本区别是什么?

1 个答案:

答案 0 :(得分:3)

互斥锁的目的是防止一个线程访问共享变量,而另一个线程正在或可能正在修改它。互斥体的语义是两个线程不能同时锁定相同的互斥锁。如果使用两个不同的互斥锁,则不会阻止一个线程访问共享变量,而另一个线程正在修改它,因为线程可以同时保存不同的互斥锁。因此代码将不再保证有效。