1.使用信号量完成多线程顺序处理

信号量的主要函数有:

int sem_init(sem_t *sem,int pshared,unsigned int value);
int sem_wait(sem_t *sem); int sem_post(sem_t *sem);

sem_init用于对指定信号初始化,pshared为0,表示信号在当前进程的多个线程之间共享,value表示初始化信号的值。 
sem_wait可以用来阻塞当前线程,直到信号量的值大于0,解除阻塞。解除阻塞后,sem的值-1,表示公共资源被执行减少了。例如:如果你对一个值为2的信号量调用sem_wait(),线程将会继续执行,信号量的值将-1。当初始化value=0后,使用sem_wai会阻塞这个线程,这个线程函数就会等待其它线程函数调用sem_post增加了了这个值使它不再是0,才开始执行,然后value值-1。 
sem_post用于增加信号量的值+1,当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制由线程的调度策略决定。 
下面是例程:


#include <stdio.h>
#include <semaphore.h>

sem_t sem;
sem_t sem1;
void* func1( void *arg)
{
sem_wait(&sem);
int *running=arg;
printf( "thread running1 \n ");
printf( "%d \n ",*running);
sem_post(&sem1);
}

void* func2( void* arg)
{
printf( "pthread2 running \n ");
sem_post(&sem);
}

void* func3( void *arg)
{
sem_wait(&sem1);
int *running=arg;
printf( "thread running3 \n ");
}
int main( int argc, char **argv)
{
sem_init(&sem, 0, 0);
sem_init(&sem1, 0, 0);
pthread_t thread[ 2];
int a= 5;
pthread_create(&(thread[ 0]), NULL,( void*)func1,( void*)&a);
printf( "main thread running \n ");
sleep( 10);
pthread_create(&(thread[ 1]), NULL,( void*)func2,( void*)&a);
pthread_create(&(thread[ 2]), NULL,( void*)func3,( void*)&a);
printf( "main thread running2 \n ");
pthread_join(thread[ 0], NULL);
pthread_join(thread[ 1], NULL);
pthread_join(thread[ 2], NULL);

}


vmuser@Linux-host:~/wqj/xuexi$ gcc shiyan.c -lpthread -lrt
vmuser@Linux-host:~/wqj/xuexi$ ./a.out 
main thread running
main thread running2
pthread2 running
thread running1
5
thread running3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值