无名信号量在多线程间的同步

//无名信号量的常见用法是将要保护的变量放在sem_wait和sem_post中间所形成的临界区内,这样该变量就会被//保护起来,例如:
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int number; // 被保护的全局变量
sem_t sem_id;
void* thread_one_fun(void *arg)
{
sem_wait(&sem_id);
printf("thread_one have the semaphore ");
number++;
printf("number = %d ",number);
sem_post(&sem_id);
}

void* thread_two_fun(void *arg)
{
sem_wait(&sem_id);
printf("thread_two have the semaphore ");
number--;
printf("number = %d ",number);
sem_post(&sem_id);
}

int main(int argc,char *argv[])
{
number = 1;
pthread_t id1, id2;
sem_init(&sem_id, 0, 1);
pthread_create(&id1,NULL,thread_one_fun, NULL);
pthread_create(&id2,NULL,thread_two_fun, NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
sem_destroy(&sem_id);
printf("main,,, ");
return 0;
}

//上面的例程,到底哪个线程先申请到信号量资源,这是随机的。如果想要某个特定的顺序的话,可以用2个信号量//来实现。例如下面的例程是线程1先执行完,然后线程2才继续执行,直至结束。
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int number; // 被保护的全局变量
sem_t sem_id1, sem_id2;
void* thread_one_fun(void *arg)
{
sem_wait(&sem_id1);
printf("thread_one have the semaphore ");
number++;
printf("number = %d ",number);
sem_post(&sem_id2);
}

void* thread_two_fun(void *arg)
{
sem_wait(&sem_id2);
printf("thread_two have the semaphore ");
number--;
printf("number = %d ",number);
sem_post(&sem_id1);
}

int main(int argc,char *argv[])
{
number = 1;
pthread_t id1, id2;
sem_init(&sem_id1, 0, 1); // 空闲的
sem_init(&sem_id2, 0, 0); // 忙的
pthread_create(&id1,NULL,thread_one_fun, NULL);
pthread_create(&id2,NULL,thread_two_fun, NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
sem_destroy(&sem_id1);
sem_destroy(&sem_id2);
printf("main,,, ");
return 0;
}

/*建两个线程,这两个线程各自将自己的一个整型变量i从1 递增到100,并通过信号量控制递增的过程,即这两个整型变量的差不能超过5。*/
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#define MAX 100
sem_t sem1,sem2;
void* th_fn1(void* arg)
{
int i;
for(i = 0; i < MAX; ++i)
{
sem_wait(&sem1);
printf("numberin thread1 is %d ",i);
sem_post(&sem2);
}
pthread_exit((void*)"thread1exit ");
}
void* th_fn2(void* arg)
{
int i;
for(i = 0; i < MAX; ++i)
{ sem_wait(&sem2);
printf("number in thread2 is %d ",i);
sem_post(&sem1);
}
pthread_exit((void*)"thread2exit ");
}
int main(void)
{
void*tret;
sem_init(&sem1,0,5);
sem_init(&sem2,0,5);
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,th_fn1,NULL);
pthread_create(&tid2,NULL,th_fn2,NULL);
pthread_join(tid1,&tret);
pthread_join(tid2,&tret);
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}

原文地址:https://www.cnblogs.com/leijiangtao/p/4110973.html