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