同时读取和写入时输出不一致
Inconsistencies in the output while reading and writing simultaneously
为什么此代码会产生不一致的读取器函数输出?
#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
,这将允许多个读者同时阅读,但当其中一个作家需要写作时,会阻止所有读者和其他作家。
相关文章:
- 大于65535的C++数组[size]引发不一致的溢出
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- Windows 10命令提示符的输出不正确
- 为什么数组到指针的输出不相关
- 同时读取和写入时输出不一致
- 二阶多项式计算器的输出不一致
- 创建邻接列表时的输出不一致
- GCC和MSVC之间的文件输出不一致
- 通过调试语句放置修复了不一致的输出
- 我做了什么导致这个程序的输出不一致?
- ofstream不一致地创建/写入输出文件