boost :: thread无法更新全局变量

问题描述 投票:0回答:1

我正在外部软件中使用包装器功能来启动新线程,该线程将更新全局变量,但是对于主线程而言,这似乎是不可见的。我无法调用join(),而不是阻止主线程并使软件崩溃。 boost :: async,boost :: thread和boost :: packaged_task的行为均相同。

uint32 *Dval;

bool hosttask1()
{

        while(*Dval<10)
        {
            ++*Dval;
            PlugIn::gResultOut << " within thread global value: " << *Dval << std::endl;    
            Sleep(500);
        }


return false;
}



void SU_HostThread1(uint32 *value)
{

Dval = value; 
*Dval = 2;
PlugIn::gResultOut << " before thread: " << *value <<  " before thread global: " << *Dval << std::endl;

    auto myFuture = boost::async(boost::launch::async,&hosttask1);

    //boost::thread thread21 = boost::thread(&hosttask1);
    //boost::packaged_task<bool> pt(&hosttask1);
    //boost::thread thread21 = boost::thread(boost::move(pt)); 
}

当我调用函数时:

number a=0 
su_hostthread1(a)
sleep(2) //seconds
result(" function returned "+a+"  \n")

OUTPUT:

before thread value: 2 before thread global value: 2
 within thread global value: 3
 within thread global value: 4
 within thread global value: 5
 within thread global value: 6
 function returned 2  
 within thread global value: 7
 within thread global value: 8
 within thread global value: 9
 within thread global value: 10

有什么想法吗?预先感谢!

c++11 boost boost-thread
1个回答
0
投票

可能是因为在优化代码时,编译器通常不会考虑多线程。如果看到您的代码重复检查了一个值,并且知道在单线程中该值无法更改,那么它只是省略了检查。

如果将变量声明为volatile,则它可能会生成效率较低的代码,需要更频繁地检查。

当然,您还必须了解,在写入值时,在某些情况下可能无法一次写入所有值,因此,如果您不幸在半写入时无法读回它,那么您会得到返回一个垃圾值。解决此问题的方法是将其声明为std :: atomic(优化程序会自动将其视为易失性),然后将发出甚至更复杂的代码,以确保写入和读取不相交(或者可能使用不同的处理器原语)。用于小对象,例如整数)

© www.soinside.com 2019 - 2024. All rights reserved.