#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <pthread.h> #include <semaphore.h> //全局缓冲区 char buf[1024] = {0}; sem_t sem_read,sem_write; //定义信号量名 int P(sem_t *sem) //P操作 申请资源 { if(sem_wait(sem) < 0) { perror("sem_wait fail\n"); exit(EXIT_FAILURE); } } int V(sem_t *sem) //V操作 释放资源 { if(sem_post(sem) < 0) { perror("sem_post fail\n"); exit(EXIT_FAILURE); } } //读线程 void* thread_r(void *arg) { while(1) { P(&sem_read); printf("buf: %s\n",buf); V(&sem_write); } } //写线程 void * thread_w(void *arg) { while(1) { P(&sem_write); putchar('>'); fgets(buf,sizeof(buf),stdin); //写入数据 V(&sem_read); } } int main(int argc, const char *argv[]) { pthread_t tid[2]; sem_init(&sem_read,0,0); //信号量初始化 sem_init(&sem_write,0,1); int ret = 0; ret = pthread_create(&tid[0],NULL,thread_r,NULL);//创建线程0 if(ret != 0) { errno = ret; perror("pthread_create fail"); exit(EXIT_FAILURE); } ret = pthread_create(&tid[1],NULL,thread_w,NULL);//创建线程1 if(ret != 0) { errno = ret; perror("pthread_create fail"); exit(EXIT_FAILURE); } printf("main thread run ......\n"); int i = 0; for(; i < 2; i++) { pthread_join(tid[i],NULL); } return 0; }
#include #include #include #include #include //全局缓冲区 char buf[1024] = {0}; sem_t sem_read,sem_write; //定义信号量名 int P(sem_t *sem) //P操作 申请资源 { if(sem_wait(sem) < 0) { perror("sem_wait fail\n"); exit(EXIT_FAILURE); } } int V(sem_t *sem) //V操作 释放资源 { if(sem_post(sem) < 0) { perror("sem_post fail\n"); exit(EXIT_FAILURE); } } //读线程 void* thread_r(void *arg) { while(1) { P(&sem_read); printf("buf: %s\n",buf); V(&sem_write); } } //写线程 void * thread_w(void *arg) { while(1) { P(&sem_write); putchar('>'); fgets(buf,sizeof(buf),stdin); //写入数据 V(&sem_read); } } int main(int argc, const char *argv[]) { pthread_t tid[2]; sem_init(&sem_read,0,0); //信号量初始化 sem_init(&sem_write,0,1); int ret = 0; ret = pthread_create(&tid[0],NULL,thread_r,NULL);//创建线程0 if(ret != 0) { errno = ret; perror("pthread_create fail"); exit(EXIT_FAILURE); } ret = pthread_create(&tid[1],NULL,thread_w,NULL);//创建线程1 if(ret != 0) { errno = ret; perror("pthread_create fail"); exit(EXIT_FAILURE); } printf("main thread run ......\n"); int i = 0; for(; i < 2; i++) { pthread_join(tid[i],NULL); } return 0; }
信号量机制(防止线程间运行紊乱)
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,
是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,
线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。
其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。
信号量是对某一类资源的抽象,防止使用同一类资源的线程间的互相抢占,合理分配资源。