1.声明信号量sem_t sem1
2.初始化信号量sem_init(&sem1,0,1)
3.sem_post和sem_wait函数配合使用来达到线程同步
4.释放信号量int sem_destroy (sem_t *sem1)
不是信号量的问题printf函数,是先写到输出缓冲,遇到\n时,或者缓冲区满时,或者有强制输出(fflush)时,才会将缓冲区里的内容输出到屏幕上(标准输出设备:stdout)。你的代码里面并没有以上3个触发条件的任意一种,所以printf的内存没有实际输出到屏幕上。
你只要在每个printf函数后面加上fflush(stdout)就可以了。
线程之间的同步和互斥解决的问题是线程对共同资源进行访问。Posix有两种方式:信号量和互斥锁;信号量适用同时可用的资源为多个的情况;互斥锁适用于线程可用的资源只有一个的情况
1、互斥锁:互斥锁是用加锁的方式来控制对公共资源的原子操作(一旦开始进行就不会被打断的操作)
互斥锁只有上锁和解锁两种状态。互斥锁可以看作是特殊意义的全局变量,因为在同一时刻只有一个线程能够对互斥锁进行操作;只有上锁的进程才可以对公共资源进行访问,其他进程只能等到该进程解锁才可以对公共资源进行操作。
互斥锁操作函数:
pthread_mutex_init()//初始化
pthread_mutex_lock()//上锁参数:pthread_mutex_t *mutex
pthread_mutex_trylock()//判断上锁 参数:pthread_mutex_t *mutex
pthread_mutex_unlock()//解锁参数:pthread_mutex_t *mutex
pthread_mutex_release()//消除互斥锁 参数:pthread_mutex_t *mutex
互斥锁分为快速互斥锁、递归互斥锁、检错互斥锁;在 init 的时候确定
int pthread_mutex_t(pthread_mutex_t *mutex, const pthread_mutex_t mutexattr)
第一个参数:进行操作的锁
mutexattr:锁的类型,默认快速互斥锁(阻塞)123456789
2、信号量:信号量本质上是一个计数器,在操作系统做用于PV原子操作;
P操作使计数器-1;V操作使计数器+1.
在互斥操作中可以是使用一个信号量;在同步操作中需要使用多个信号量,并设置不同的初始值安排它们顺序执行
sem_init() // 初始化操作
sem_wait() // P操作,计数器减一;阻塞参数:sem_t *sem
sem_trywait() // P操作,计数器减一;非阻塞 参数:sem_t *sem
sem_post()// V操作,计数器加一 参数:sem_t *sem
sem_destroy() // 销毁信号量参数:sem_t *sem
sem_init(sem_t *sem, int pshared, int value)
pshared用于指定多少个进程共享;value初始值
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)