当前位置: 技术问答>linux和unix
关于Linux下多线程情况下全局变量保护的问题,求个解决方案
来源: 互联网 发布时间:2015-12-22
本文导语: 要个效率高的方法 需附上全部源代码 | 这个比较全面了! #include #include #include pthread_mutex_t mutex; pthread_cond_t cond; void * child1(void *arg) { pthread_cleanup_push(pthread_mutex_unlock,&mut...
要个效率高的方法
需附上全部源代码
需附上全部源代码
|
这个比较全面了!
#include
#include
#include
pthread_mutex_t mutex;
pthread_cond_t cond;
void * child1(void *arg)
{
pthread_cleanup_push(pthread_mutex_unlock,&mutex);
while(1){
printf("thread 1 get running n");
printf("thread 1 pthread_mutex_lock returns %dn",
pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread 1 condition appliedn");
pthread_mutex_unlock(&mutex);
sleep(5);
}
pthread_cleanup_pop(0);
}
void *child2(void *arg)
{
while(1){
sleep(3);
printf("thread 2 get running.n");
printf("thread 2 pthread_mutex_lock returns %dn",
pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread 2 condition appliedn");
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
int main(void)
{
int tid1,tid2;
printf("hello, condition variable testn");
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
pthread_create(&tid1,NULL,child1,NULL);
pthread_create(&tid2,NULL,child2,NULL);
do{
sleep(2); /* comment 4 */
pthread_cancel(tid1); /* comment 5 */
sleep(2); /* comment 6 */
pthread_cond_signal(&cond);
}while(1);
sleep(100);
pthread_exit(0);
}
有关于各种锁的效率的文章
http://www-128.ibm.com/developerworks/cn/linux/sdk/rt/part5/index.html
#include
#include
#include
pthread_mutex_t mutex;
pthread_cond_t cond;
void * child1(void *arg)
{
pthread_cleanup_push(pthread_mutex_unlock,&mutex);
while(1){
printf("thread 1 get running n");
printf("thread 1 pthread_mutex_lock returns %dn",
pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread 1 condition appliedn");
pthread_mutex_unlock(&mutex);
sleep(5);
}
pthread_cleanup_pop(0);
}
void *child2(void *arg)
{
while(1){
sleep(3);
printf("thread 2 get running.n");
printf("thread 2 pthread_mutex_lock returns %dn",
pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread 2 condition appliedn");
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
int main(void)
{
int tid1,tid2;
printf("hello, condition variable testn");
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
pthread_create(&tid1,NULL,child1,NULL);
pthread_create(&tid2,NULL,child2,NULL);
do{
sleep(2); /* comment 4 */
pthread_cancel(tid1); /* comment 5 */
sleep(2); /* comment 6 */
pthread_cond_signal(&cond);
}while(1);
sleep(100);
pthread_exit(0);
}
有关于各种锁的效率的文章
http://www-128.ibm.com/developerworks/cn/linux/sdk/rt/part5/index.html
|
用POSIX 互斥锁比信号灯效率快20倍左右。
如果对全局变量的读、写操作差不多的话可以使用POSIX 互斥锁,可能回牺牲系统效率10%左右。
如果读操作比写操作要多的话可以使用读写锁。
互斥锁: pthread_mutex_lock pthread_mutex_unlock
读写锁: pthread_rwlock_rdlock pthread_rwlock_wrlock pthread_rwlock_unlock
如果对全局变量的读、写操作差不多的话可以使用POSIX 互斥锁,可能回牺牲系统效率10%左右。
如果读操作比写操作要多的话可以使用读写锁。
互斥锁: pthread_mutex_lock pthread_mutex_unlock
读写锁: pthread_rwlock_rdlock pthread_rwlock_wrlock pthread_rwlock_unlock
|
访问全部变量之前加锁互斥就可以了,用信号量没有必要啊