初夏小谈:全面剖析多线程(二)
一、再谈线程安全之条件变量2
条件变量用于实现线程间的同步即唤醒与等待。条件变量和互斥锁搭配使用,是因为条件变量本身不具备操作判断的功能,对条件的判断是临界资源的操作,必须保证是原子操作。
1.实现多线程操作:
在之前的实现的是单线程,并且只用了一个条件变量这导致了唤醒时会混乱,将不知唤醒是做饭的人还是吃饭的人。所以就要用多个条件变量来唤醒和等待不同的对象。
在实现中pthread_con_wait中有加锁,休眠的原子操作,不可打断,再后被唤醒有加锁的功能。
代码实现:
实现结果:
二、线程安全之生产者与消费者模型
1.生产者与消费者模型在实现时会出现:多个生产者和多个消费者的场景。当多个生产者或消费者改变数据时会出现冲突。那么就要无比保证对临界资源的安全操作。与上一个用条件变量实现多线程的区别在于,它会事先生产一批数据。然后随时取随时补上。
代码实现:
实现结果:
在实现生产者和消费者时注意:
1.在C++中进行传参时,不支持将地址进行值传递,所以要进行一个强转reinterpret_cast<long long>(arg),由于64位操作系统指针占8个字节所以将转为long long型,当然long已经可以。
珍&源码