互斥或不互斥?

如果我只有一个读者和一个作者,我需要一个互斥体吗? 阅读器从队列中获取下一个命令( food.front() ),并根据该命令执行任务。 命令执行后,会popup命令。 队列的作者将命令推送到队列( food.push() )。

我需要一个互斥体吗? 我的阅读器(消费者)只执行,如果food.size() > 0 。 我正在使用读取器线程并发送线程。

Solutions Collecting From Web of "互斥或不互斥?"

在多线程环境中使用互斥锁。 我在你的问题中没有提到线程,所以我没有看到需要一个互斥体。

但是,如果我们假设读者和写者是指你有两个线程,则需要使用互斥锁(或其他多线程保护机制)来保护相互数据。

当队列中有条目时,会发生什么情况,读者线程在写入线程放置某些东西时会弹出什么东西? 灾害! 使用互斥锁,您一定只能在队列上运行一个线程。

另一种方法是一个无锁线程安全队列。 它会使用原子操作来确保数据不被错误操作。

如果读者看到大小大于零,但是结构尚未完全更新,会发生什么情况?

这可以通过非常仔细地编码更新来避免,但是使代码抵御未来篡改更新的方式是使用互斥锁。

假设“作家”和“读者”是分开的线索:

最有可能的是:在“书写”事件和“读取”事件之间可以有一个“亚稳”状态,其中指向结构的指针是一致的。

当然这取决于实现:如果使用一个原子操作来更新指针,那么没有互斥就可能是好的。

完全取决于实现,如果你有两个不同的线程访问相同的变量,你将需要一个互斥体。 否则,你可能会以不一致的计数结束。

说在写你做++计数,在读你做 – 计数,并说当前值是2.现在请注意,这些语句不需要是原子,++计数可能包括读取变量计数,增加它和然后再写回来。 没有一个写和读是同时执行,并说写入的第一个位被执行(即它加载值2,然后整个读取执行递减计数,但另一个线程仍然有值2加载,它增加然后写回变量,现在你只是失去了一个阅读的动作。

你的问题取决于两个条件:

  1. 只有两个线索,一个是生产者,另一个是消费者
  2. 该结构被设计为无锁

如果同时满足,则可以放弃锁定,或者需要使用锁定来保护队列结构。
为了取消锁定,必须记得在步骤结束时更新头部或尾部指针。