std :: lock怎么知道它失败了

时间:2015-10-10 22:48:57

标签: c++11 locking

It is not clear from the documentation。此模板函数返回void。该文件提到 -

  

如果该功能无法锁定所有对象,则该功能首先解锁   失败前它成功锁定的所有对象(如果有的话)。

但是如何打电话者知道它失败了? 它是否会成功阻止,异常是唯一的失败情形?

1 个答案:

答案 0 :(得分:2)

It throws an error on any issue.

正如其他SO成员过去在我自己提出的问题上提到的那样,请远离 CPlusPlus.com - The Canonical Reference for Misinformation

请以此为契机,了解之间的差异。 C要求函数参数返回代码或副作用,而C ++除了上述内容外还提供exceptions

参数

(无)

返回值

(无)

例外

  

发生错误时抛出std :: system_error,包括来自的错误   底层操作系统会阻止锁定来满足它   规格。在任何异常情况下,互斥锁都不会被锁定   被抛出。

注释

  

lock()通常不直接调用:std :: unique_lock和   std :: lock_guard用于管理独占锁定。

实施例

  

此示例显示了如何使用锁定和解锁来保护共享   数据

#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>

int g_num = 0;  // protected by g_num_mutex
std::mutex g_num_mutex;

void slow_increment(int id) 
{
    for (int i = 0; i < 3; ++i) {
        g_num_mutex.lock();
        ++g_num;
        std::cout << id << " => " << g_num << '\n';
        g_num_mutex.unlock();

        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

int main()
{
    std::thread t1(slow_increment, 0);
    std::thread t2(slow_increment, 1);
    t1.join();
    t2.join();
}