从多个线程c ++中更改共享变量

时间:2017-09-10 13:52:07

标签: c++ multithreading

我想知道是否有任何方法可以在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);
}

2 个答案:

答案 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)

我认为这是您问题的完整示例:

http://www.cplusplus.com/reference/mutex/mutex/