【发布时间】:2015-05-07 11:47:03
【问题描述】:
想象以下场景:
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>
void DoSomething(int* i)
{
std::cout << *i << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
*i = 2;
std::cout << *i << std::endl;
}
int main()
{
std::vector<int> v = {0, 0, 0};
v[0] = 1;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::thread t(&DoSomething, &v[0]);
t.join();
std::cout << v[0] << std::endl;
}
是否有任何理由应该与向量元素一起传递互斥锁?
P.D.从 2015 年 5 月 8 日起
我在发帖时没有详细说明这个问题,因为我不想影响答案。到昨天为止,您的回答几乎是我的理解。然而,有人向我建议,直觉行为可能无法像人们希望的那样在线程场景中发挥作用。特别是,在这种情况下,有人建议,例如,假设发生在主线程上的写入 v[0] = 1 是在没有互斥体的情况下将在 DoSomething 中打印时得到反映的假设不能保证。作为一种可能的解释,我被告知该值可能会进入线程可访问内存,但它可能会在写入跨线程内存之前被不同线程的状态换出,并且再次保证唯一的方法所需的传播将使用互斥锁。你对这个论点有什么看法?
【问题讨论】:
标签: c++ multithreading mutex