linux多线程信号量sem_wait()到sem_post()之间逻辑代码是

我告诉你一件事情:前年我在做这个分布式系统的时候,遇到了一个失败。
在没有锁的情况下在多个线程中使用信号量将是致命的。

你说的很对。
去年的金融项目我们有一个生产者-消费者模型,有四个生产流和四个消费流。
如果不加锁,数据就会被破坏。
A厂商刚刚排队了一个号,B厂商也冲了进来,数据被覆盖了。
在最后的和解中,我表现得像只小鸟。

当时我就觉得需要屏蔽。
在厂商这边,对互斥体配置一个锁,必须在sem_wait()之前加锁。
例如,使用 pthread_mutex_lock()。
当锁被锁定并且sem_wait()函数成功时,你才敢往队列中放入数据。
一旦满了,sem_post() 就会释放信号量,随后很快就会释放 pthread_mutex_unlock()。
你看,这个订单不能被破坏。

这同样适用于消费者。
去年夏天,在另一个项目中,我们同时删除了相关列表和多个线程。
如果不锁定它,它会立即失败。
当一个线程删除一个节点时,另一个线程也会来删除它。
结果,该节点被删除两次,并且空指针变得可用。
最后我简单的加了一个pthread_mutex_lock()锁,在删除节点之前加锁,删除之后再pthread_mutex_unlock()。
现在安全了。

您提到生产者在 while 循环开始时请求空间,释放空间,并将其移出循环。
我也用过这个技巧。
前年的消息队列项目中,生产者申请空间时,首先看的是信号量。
如果没有足够的空间,他们就会等待。
释放空间时,要等到整个业务都处理完之后才释放,避免中途被其他线程打断。

简单来说,就是在sem_wait()和sem_post()前后添加了互斥锁。
这非常重要。
在不阻塞的情况下跨多个线程使用信号量确实是不可能的。
当你你这么说,我就想到了这些陷阱。
这确实需要做。

Linux多线程同步互斥量Mutex详解