我编写了以下程序来在POSIX中实现两个线程。有一个全局共享变量sum
,它可以同时由两个不同的线程访问。我在访问共享变量时使用了互斥锁和解锁每个线程。我有个问题。这里我在两个线程中使用了相同的互斥锁(pthread_mutex_lock(&mutex)
)。如果我在pthread_mutex_lock(&mutex)
中的thread1
和pthread_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;
}
在访问共享变量时,使用相同的互斥锁和不同的互斥锁之间的基本区别是什么?
答案 0 :(得分:3)
互斥锁的目的是防止一个线程访问共享变量,而另一个线程正在或可能正在修改它。互斥体的语义是两个线程不能同时锁定相同的互斥锁。如果使用两个不同的互斥锁,则不会阻止一个线程访问共享变量,而另一个线程正在修改它,因为线程可以同时保存不同的互斥锁。因此代码将不再保证有效。