何时使用互斥锁?

时间:2014-03-22 22:10:02

标签: c++ multithreading pthreads gtkmm

我一直在使用gtkmm和多线程GUI,并且偶然发现了互斥锁的概念。从我能够收集的内容来看,它的目的是锁定对单个线程的变量的访问,以避免并发问题。我理解这一点似乎很自然,但是我仍然不知道应该如何使用互斥锁。我已经看到了几种用途,其中互斥锁仅被锁定以访问特定变量(例如like this tutorial)。对于哪种类型的变量/数据应该使用互斥锁?

PS:我在这个问题上发现的大多数答案都是技术性的,因为我不是专家,所以我更多地寻找概念答案。

2 个答案:

答案 0 :(得分:2)

如果您有从多个线程访问的数据,则可能需要互斥锁。你经常会看到像

这样的东西
theMutex.lock()
do_something_with_data()
theMutex.unlock()

或者c ++中更好的习语是:

{
    MutexGuard m(theMutex)
    do_something_with_data()
}

MutexGuard c'tor执行lock()和d'tor执行unlock()

这个一般规则有一些例外

  • 如果您使用的数据可以原子方式访问,则不需要锁定。在Visual Studio中,您可以执行InterlockedIncrement()之类的功能。 gcc有自己的设施来做这件事。

  • 如果您要访问的数据只是读取它而从不更改它,那么通常可以安全地进行锁定。但是,如果即使单个线程对数据进行任何更改,所有其他线程也需要确保它们在更改时不会尝试读取数据。您还可以阅读有关此类情况的Reader-Writer锁定。

答案 1 :(得分:1)

在多个线程之间更改的变量。因此,未修改的数据(不可变)或未共享的数据不需要