同时读取和写入时输出不一致

Inconsistencies in the output while reading and writing simultaneously

本文关键字:输出 不一致 读取      更新时间:2023-10-16

为什么此代码会产生不一致的读取器函数输出?

#include <cstdio>
#include <thread>
#include <mutex>
std::mutex mu;
int i = 0;
void writeThread()
{
for (int j = 0; j < 1000; ++j)
{
std::lock_guard<std::mutex> lock(mu);
printf ("write i: %dn", ++i);
}
}
void readThread()
{
for (int j = 0; j < 1000; ++j)
printf ("Read i = %dn", i);
}
int main()
{
std::thread t(writeThread);
std::thread z(readThread);
t.join();
z.join();
return 0;
}

我有时会得到这样的东西:

write i: 996
write i: 997
Read i = 980 <--- wrong reader output starting here
Read i = 998
Read i = 998
write i: 998
Read i = 998
write i: 999
Read i = 999

是只有输出错误还是我真的需要在读取器函数中使用互斥锁?

是只有输出是错误的还是我真的需要在读取器函数中使用互斥锁?

输出没有错,如果您有两个或多个线程访问变量,并且其中至少有一个是编写器,那么您需要提供同步。 由于readThread不会等待WriteThread写入i因此您存在竞争条件。 这是未定义的行为,您获得的任何输出都是"正确的"。 要解决此问题,您需要将std::lock_guard<std::mutex> lock(mu);添加到readThread例如

void readThread()
{
for (int j = 0; j < 1000; ++j)
{
std::lock_guard<std::mutex> lock(mu);
printf ("Read i = %dn", i);
}
}

如果你有更多的阅读器,那么你有作家,你可以使用一个std::shared_mutex,这将允许多个读者同时阅读,但当其中一个作家需要写作时,会阻止所有读者和其他作家。