Chinaunix首页 | 论坛 | 博客
  • 博客访问: 207219
  • 博文数量: 38
  • 博客积分: 2060
  • 博客等级: 大尉
  • 技术积分: 388
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-17 10:10
文章分类

全部博文(38)

文章存档

2011年(1)

2009年(37)

我的朋友

分类: LINUX

2009-08-10 15:47:12

一、互斥锁

互斥锁用于保护可能被多个线程同时访问到的共享变量。一个线程要访问一个共享变量的条件是持有该变量的互斥锁。如果一个线程试图给一个已经被其他线程上过锁的共享变量上锁,该线程会被挂起,直到互斥锁被解锁。互斥锁的数据类型为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;
static int condition = 0;


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);

    while(condition == 0)

    {
        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);

    condition = 1;
    pthread_cond_signal(&mycond);
    pthread_mutex_unlock(&mymutex);
    return 0;
}

阅读(1700) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~