免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 990 | 回复: 0
打印 上一主题 下一主题

互斥锁以及条件变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-10 15:47 |只看该作者 |倒序浏览
一、互斥锁
互斥锁用于保护可能被多个线程同时访问到的共享变量。一个线程要访问一个共享变量的条件是持有该变量的互斥锁。如果一个线程试图给一个已经被其他线程上过锁的共享变量上锁,该线程会被挂起,直到互斥锁被解锁。互斥锁的数据类型为pthread_mutex_t,通常分为两种,一种是静态的,一种是动态的,静态的必需初始化为PTHREAD_MUTEX_INITIALIZER,动态的必需调用pthread_mutex_init进行初始化。
操作互斥锁的函数有(具体可参考man手册):
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
二、条件变量
条件变量是线程中的东西,就是等待某一条件的发生,类似于信号。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。条件变量类型为pthread_cond_t。操作条件变量的常用函数有(具体参考man手册):
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
int pthread_cond_destroy(pthread_cond_t *cond);
三、一个例子

#include stdio.h>
#include unistd.h>
#include pthread.h>
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;
void routine(void *arg)
{
    pthread_mutex_unlock(&mymutex);
    return;
}
void *thread_func(void *arg)
{
    //pthread_cleanup_push(void (*)(void *)pthread_mutex_unlock, &mymutex);
    pthread_cleanup_push(routine, NULL);
    pthread_mutex_lock(&mymutex);
    pthread_cond_wait(&mycond, &mymutex);
    printf("hahaha\n");
    pthread_mutex_unlock(&mymutex);
    pthread_cleanup_pop(0);
    return NULL;
}
int main(int argc, char **argv)
{
    pthread_t tid;
   
    pthread_create(&tid, NULL, thread_func, NULL);
    pthread_mutex_lock(&mymutex);
    sleep(5);
    pthread_cond_signal(&mycond);
    pthread_mutex_unlock(&mymutex);
    return 0;
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93784/showart_2023500.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP