作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下程序来实现 POSIX 中的两个线程。有一个全局共享变量sum
,它被两个不同的线程同时访问。在访问共享变量时,我在每个线程内使用了互斥锁和解锁。我有个问题。在这里,我在两个线程中使用了相同的互斥锁 (pthread_mutex_lock(&mutex)
)。如果我在 thread1
和 pthread_mutex_lock(&mutex1)
中使用两个不同的互斥锁和解锁线程(例如 pthread_mutex_lock(&mutex)
)会发生什么> 在 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;
在访问共享变量时使用相同互斥锁和使用不同互斥锁的基本区别是什么?
最佳答案
互斥量的目的是防止一个线程访问共享变量而另一个线程正在或可能正在修改它。互斥量的语义是两个线程不能同时锁定同一个互斥量。如果您使用两个不同的互斥锁,您不会阻止一个线程访问共享变量而另一个线程正在修改它,因为线程可以同时持有不同的互斥锁。因此代码将不再保证有效。
关于c - 在线程中使用不同的互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33199389/
我是一名优秀的程序员,十分优秀!