信号量线程同步

信号量是一种特殊类型的变量,可以被增加和减少,但是对其的访问被保证是原子操作,就算是多线程中也是如此,这样如果多个地方都试图修改信号量的值,能够保证以此进行

二进制信号量只有0和1两种取值,而计数信号量可以设置更大的范围;通常用来保护一段代码,让每次只能被一个执行线程执行,直接通过二进制信号量可实现

线程中用到的信号量函数有下面几个

#include <semaphore.h>
int[......]

Read more

Cygwin和Linux不同环境多线程加锁的差异

深夜本来都打算弄完睡觉,结果被一个莫名其妙的锁搞得莫名其妙,为了让同步问题明显地表现出来,主线程和子线程都加了一个sleep 1秒,使得都来不及减减操作,if判断就都为真,导致结果变成了-1,但这不是想要的结果

于是想通过互斥量加锁,让一个if以及减减线执行完,然后解锁再执行另一个,可居然还是返回-1,更奇怪的是,去掉两个线程里的sleep,锁就起效果了,难道是这中间的具体实现流程问题没完全弄清楚[……]

Read more

多线程互斥量同步

多线程在一个进程中有多个控制权,也会有多个函数同时运行,执行各自的CPU指令,就算单CPU,也可以通过线程间指令切换,达到多线程同时运行的效果

并发情况,不同线程之间指令无法确定执行先后顺序,假如这个顺序对运行结果造成影响,那么就会出现竞争,而且会出现问题,要解决竞争可以将原本分离的不同线程间的指令修改成原子操作,那么竞争自然就不存在了

多线程由于可以共享资源,因此同步问题必须要解决,在一定时间区[……]

Read more

线程执行小例子

虽然成功地创建新的线程,但是需要知道这两个线程是否的确同时都在执行,可以通过一个小例子,这里就不考虑性能运行效率了

这里的想法就是设置一个全局变量,让它在0和1之间跳动,主线程在这个flag为0的时候,就打印0,并将flag赋值为1,而在这个过程当中,子线程沉睡1秒,;同样的接下来子线程在这个flag为1的时候,打印1,并将flag赋值为0,而这个过程中,主线程沉睡1秒,说白了也就是主线程和子线程[……]

Read more