如何解决以下代码线程不安全吗?是的,我如何使可能的结果出来呢?
以下程序的屏幕输出是否确定?我的理解是不是,因为它可能是1或2,这取决于在另一个线程向其中写入1之前还是之后,要拾取最新i
值的线程是否拾取它。>
另一方面,我仍然看到相同的输出,就像每个线程都等待上一个线程完成一样,在这种情况下,我在屏幕上看到2个,如果从t1
到{ {1}},并加入他们的行列。
如果答案为否,则结果不是确定性的,是否有一种简单的玩具程序可以增加可能结果之一出现的可能性?
t100
(我正在这样编译并运行它:#include <iostream>
#include <thread>
int main() {
int i = 0;
std::thread t1([&i](){ ++i; });
std::thread t2([&i](){ ++i; });
t1.join();
t2.join();
std::cout << i << '\n';
}
。)
解决方法
您始终会看到相同的结果,因为第一个线程在第二个线程之前启动并运行其操作。这缩小了发生竞争状况的窗口。
但是最终,由于++操作不是原子操作(读取值,然后递增,然后写入),仍然有发生的可能性。
如果两个线程同时启动(例如:由于CPU繁忙导致线程1变慢),那么它们将读取相同的值,最终结果将为1。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。