Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更改多线程的共享变量c++;_C++_Multithreading - Fatal编程技术网

C++ 更改多线程的共享变量c++;

C++ 更改多线程的共享变量c++;,c++,multithreading,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

我想知道是否有任何方法可以在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);
}
#包括
#包括
另一个(int x);
std::载体myarr;
void main(){
myarr.推回(0);
标准:螺纹t1(另一个,2);
t1.join();
}
无效推送另一个(int x){
myarr.推回(x);
}

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


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


在这种特殊情况下,代码(除非线程上缺少连接)出人意料地正常

这是因为
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);
}
#包括
#包括
#包括
另一个(int x);
//用于处理共享资源争用的互斥
std::互斥m;
//共享资源
std::载体myarr;
自动推送(int i)->无效
{
//拿把锁。。。
自动锁定=标准::唯一锁定(m);
//修改/读取资源
myarr.推回(i);
//~lock隐式释放锁
}
int main(){
标准:螺纹t1(另一个,2);
推它(0);
t1.join();
}
无效推送另一个(int x){
推它(x);
}

在这种特殊情况下,代码(除非线程上缺少连接)出人意料地正常

这是因为
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);
}
#包括
#包括
#包括
另一个(int x);
//用于处理共享资源争用的互斥
std::互斥m;
//共享资源
std::载体myarr;
自动推送(int i)->无效
{
//拿把锁。。。
自动锁定=标准::唯一锁定(m);
//修改/读取资源
myarr.推回(i);
//~lock隐式释放锁
}
int main(){
标准:螺纹t1(另一个,2);
推它(0);
t1.join();
}
无效推送另一个(int x){
推它(x);
}

您应该使用互斥锁保护对
myarr
的访问。还有
join()
退出
main()之前的线程。最后但可能并非最不重要的一点是,您缺少了
pushOther()
的正向声明。简单示例代码:只是尝试谈论此处创建的错误,因为它在pushOther函数上中断。请将a与逐字错误文本一起发布。您的问题。您应该使用互斥锁保护对
myarr
的访问。还有
join()
退出
main()之前的线程。最后但可能并非最不重要的一点是,您缺少了
pushOther()
的正向声明。简单示例代码:只是尝试谈论此处创建的错误,因为它在pushOther函数上中断。请将a与逐字错误文本一起发布。你的问题,谢谢!代码似乎很有用,我只是在玩互斥,但是谢谢你的例子。谢谢!代码似乎可以工作,我只是在玩互斥的,但谢谢你的例子。