多线程Linux应用程序中的互斥

Mutexes in multithread Linux application

本文关键字:Linux 应用程序 多线程      更新时间:2023-10-16

你能帮助我了解如何在多线程Linux应用程序中使用互斥吗,其中:

  • 在数据写入过程中,需要在写入和读取时锁定变量
  • 在从变量读取数据期间,需要在写入时将其锁定

因此,可以同时读取,但写入操作是同一时间内的单个操作。在写入过程中,所有其他操作都应等待完成。

您所问的问题比互斥锁级别高一点。互斥锁是一种简单的低级设备。当用互斥锁锁定线程时,CPU要么在获得锁的线程中执行代码,要么完全在执行其他进程。换句话说,互斥锁已经锁定了属于同一(重量级)进程的所有其他线程。

您询问的是读写锁。读写锁在后台使用互斥锁。处理读写锁的POSIX函数从pthread_rwlock_开始。由于您在Linux机器上,只需键入man pthread并查找标记为"读/写锁定路由"的部分。

您需要一个读写器锁来允许多个读写程序。

如果您没有其他首选的线程库,那么Boost.Thread就有其中一个(Boost::shared_mutex)。这在底层使用了PThreads基元,可能会节省您自己包装原始API的时间。

我不建议你自己实现这一点——很容易得到一些看起来有效的东西,但在负载下,要么会崩溃或扼杀性能,要么(最糟糕的是)以不应该的方式默默修改数据,所以你会得到糟糕的结果。

正如@Als所指出的,这里也可以使用一个简单的boost::mutex,但不允许多次并发读取。这更容易实现,并且可能足以满足您的需求,具体取决于您的读/写访问配置文件。

如果您有从不同线程访问(读取和写入)的全局或静态对象,则需要使用互斥。