实例1
#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
pthread_t pthid1,pthid2;
sem_t sem;
static void * fun1(void *arg){
sem_wait(&sem);
puts("second");
return NULL;
}
static void * fun2(void *arg){
puts("fist");
sem_post(&sem);
return NULL;
}
int main(int argc, const char *argv[])
{
sem_init(&sem, 0, 0);
if(0 != pthread_create(&pthid1,NULL,fun1,NULL)){
perror("pthid1");
return -1;
}
if(0 != pthread_create(&pthid2,NULL,fun2,NULL)){
perror("pthid2");
return -1;
}
pthread_join(pthid1,NULL);
pthread_join(pthid2,NULL);
return 0;
}
实例2
#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
pthread_t pthid1,pthid2;
sem_t sem1;
sem_t sem2;
int i = 1000;
static void * fun1(void *arg){
while(1){
sem_wait(&sem2);
printf("thread1 --- %d\n",--i);
usleep(100000);
sem_post(&sem1);
}
return NULL;
}
static void * fun2(void *arg){
while(1){
sem_wait(&sem1);
printf("thread2 --- %d\n",--i);
usleep(100000);
sem_post(&sem2);
}
return NULL;
}
int main(int argc, const char *argv[])
{
sem_init(&sem1, 0, 1);
sem_init(&sem2, 0, 0);
if(0 != pthread_create(&pthid1,NULL,fun1,NULL)){
perror("pthid1");
return -1;
}
if(0 != pthread_create(&pthid2,NULL,fun2,NULL)){
perror("pthid2");
return -1;
}
pthread_join(pthid1,NULL);
pthread_join(pthid2,NULL);
return 0;
}
实例3
#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
pthread_t pthid1,pthid2;
sem_t sem;
static void * fun1(void *arg){
sem_wait(&sem);
puts("second");
sem_post(&sem);
return NULL;
}
static void * fun2(void *arg){
sem_wait(&sem);
puts("fist");
sem_post(&sem);
return NULL;
}
int main(int argc, const char *argv[])
{
sem_init(&sem, 0, 1);
if(0 != pthread_create(&pthid1,NULL,fun1,NULL)){
perror("pthid1");
return -1;
}
if(0 != pthread_create(&pthid2,NULL,fun2,NULL)){
perror("pthid2");
return -1;
}
pthread_join(pthid1,NULL);
pthread_join(pthid2,NULL);
return 0;
}
重点函数
int sem_init(sem_t *sem, int pshared, unsigned int value);
1/功能
初始化信号量对应的资源数目
2/参数
参数1 为 信号量指针
参数2 为 是否共享,0表示共享在线程中,进程中,非0表示只共享在进程中
参数3 为 资源的数量
3/返回值
返回值 ,成功为0,失败为-1
1/功能
抢占资源
如果参数指向的资源为0,则阻塞
如果参数指向的资源大于0,则资源减1,函数返回
1/功能
释放资源
资源加1,返回.
注意: 资源不可能为负数.