C++中多线程中的读取器和编写器

Reader and writer in multithread in C++

本文关键字:读取 多线程 C++      更新时间:2023-10-16

这是我的问题。我有两个线程 writer1 和 writer2 修改结构的属性,编写器 1 写在属性 1 中,编写者 2 在属性 2 中写入。我有一个线程阅读器来阅读结构。我等待的是:当 writer1 在写作时,writer2 也可以同时写作。(它不会引起问题,因为它们修改了不同的属性)。当然,当 writer2 在写作时,writer 1 也可以同时写作。但是,当读取器读取结构的值时,writer1 和 writer 2 都不能同时写入。我确保我正在读取的值不会被其他线程更改

示例:

typedef struct
{
    int a;
    double b;
} data;
data glob;
int main()
{
    thread reader([]()
    {
        while(1)
        {
            sleep(1s);
            cout << glob;
        }
    });
    thread writer1([]()
    { 
        while(1)
            glob.a++;
    });
    thread writer2([]()
    { 
        while(1)
            glob.b++;
    });
    int i;
    cin >>i;
}

解决方案平面的一端 - 编写器和读取器共享的单个互斥锁和单个条件变量。

另一端 - 两个原子变量和阅读器在两者之间旋转。

在体系结构上最干净(如果做得好,速度也很快) - 由编写器 ID 键控的读取器的收件箱队列,因此来自同一编写器的两个邮件都无法排队。

只使用互斥;)它使用起来非常简单,可以解决你的问题。http://en.cppreference.com/w/cpp/thread/mutex