c ++互斥体不会从内部阻止代码,但允许从外部阻止它

时间:2021-05-23 20:13:23

标签: c++ c++17 mutex stdmutex

我正在尝试解决下一个问题:

有两种类型的函数。第一种类型可以同时从不同的线程执行(例如 - 从容器读取数据)。第二个必须阻塞第一个类型函数内的所有线程,直到完成某些操作(例如 - 更改容器)。

我确信这是一项简单的任务,但我找不到解决方案。有人可以帮我吗?

这是一个简单的例子。我希望线程每 3 秒停止输出 1 秒(我知道这段代码不安全(来自不同线程),但这只是一个简单的例子)

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

using namespace std;


void f() {
    // TODO: wait if g() locked this
    cout << "Hello from thread " << this_thread::get_id() << endl;
    this_thread::sleep_for(100ms);
}

void g() {
    // TODO: some lock for f()
    cout << "All threads must sleep at night" << endl;
    this_thread::sleep_for(1000ms);
    // TODO: unlock
}

int main() {
    thread t1([]() { for (;;) f(); });
    thread t2([]() { for (;;) f(); });
    thread t3([]() { for (;;) f(); });

    for (;;) {
        this_thread::sleep_for(3000ms);
        g();
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

这是使用读取器/写入器锁最好解决的常见模式。在 C++ 中,您想使用 std::shared_lock 并假设 f 是读者,而 g 是作者。

声明变量:

std::shared_mutex mutex;

f中:

// Multiple threads can enter the shared lock (readers).
std::shared_lock lock(mutex);

g中:

// Only one thread can enter the unique lock (writers).
std::unique_lock lock(mutex);
相关问题