首页 > 代码库 > Linux下多线程编程之互斥锁、条件变量、信号量

Linux下多线程编程之互斥锁、条件变量、信号量

1、进程创建

 int pthread_create (pthread_t * thread_id, __const pthread_attr_t * __attr, void *(*__start_routine) (void *), void *__restrict __arg);

第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。

一个实例:

void *producer(void *args);

pthread_t tha;

pthread_create(&tha,NULL,producer,NULL);

pthread_join(tha,NULL);

2、互斥锁

通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

一个实例:

pthread_mutex_t lock;

pthread_mutex_init(&lock,NULL);

pthread_mutex_lock(&lock);

临界区

pthread_mutex_unlock(&lock);

3、条件变量

利用线程间共享的全局变量进行同步的一种机制,通常与互斥锁一起使用。

int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex); //该函数要在mutex的锁定区域内使用

int pthread_cond_signal(pthread_cond_t *cond);

一个实例:

pthread_cond_t notfull;

pthread_mutex_lock(&lock);

pthread_cond_wait(&notfull,&lock);

pthread_mutex_unlock(&lock);

4、信号量

#include <semaphore.h>
int sem_init(sem_t *sem , int pshared, unsigned int value);

int sem_wait(sem_t *sem); //给信号量减1,对一个值为0的信号量调用sem_wait,这个函数将会等待直到有其它线程使它不再是0为止。
int sem_post(sem_t *sem); //给信号量的值加1

int sem_destroy(sem_t *sem);

一个实例:

sem_t empty;

sem_t occupied;  //这两个变量是全局变量

sem_wait(&empty);

...

sem_post(&occupied);

 

Linux下多线程编程之互斥锁、条件变量、信号量