我正在外部软件中使用包装器功能来启动新线程,该线程将更新全局变量,但是对于主线程而言,这似乎是不可见的。我无法调用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
有什么想法吗?预先感谢!
可能是因为在优化代码时,编译器通常不会考虑多线程。如果看到您的代码重复检查了一个值,并且知道在单线程中该值无法更改,那么它只是省略了检查。
如果将变量声明为volatile
,则它可能会生成效率较低的代码,需要更频繁地检查。
当然,您还必须了解,在写入值时,在某些情况下可能无法一次写入所有值,因此,如果您不幸在半写入时无法读回它,那么您会得到返回一个垃圾值。解决此问题的方法是将其声明为std :: atomic(优化程序会自动将其视为易失性),然后将发出甚至更复杂的代码,以确保写入和读取不相交(或者可能使用不同的处理器原语)。用于小对象,例如整数)