我想知道是否有任何方法可以在c ++
中实现从多个线程更改共享/全局变量想象一下这段代码:
#include <vector>
#include <thread>
void pushanother(int x);
std::vector<int> myarr;
void main() {
myarr.push_back(0);
std::thread t1(pushanother, 2);
t1.join();
}
void pushanother(int x) {
myarr.push_back(x);
}
答案 0 :(得分:3)
在这种特殊情况下,代码是(除非线程上没有连接),令人惊讶的确定。
这是因为std::thread
的构造函数会导致内存栅栏操作,并且第一个线程不会在此栅栏后修改或读取向量的状态。
实际上,您已将向量的控制转移到第二个线程。
但是,修改代码以表示更正常的情况需要显式锁定:
#include <vector>
#include <thread>
#include <mutex>
void pushanother(int x);
// mutex to handle contention of shared resource
std::mutex m;
// the shared resource
std::vector<int> myarr;
auto push_it(int i) -> void
{
// take a lock...
auto lock = std::unique_lock<std::mutex>(m);
// modify/read the resource
myarr.push_back(i);
// ~lock implicitly releases the lock
}
int main() {
std::thread t1(pushanother, 2);
push_it(0);
t1.join();
}
void pushanother(int x) {
push_it(x);
}
答案 1 :(得分:0)
我认为这是您问题的完整示例: