我有一个应用程序,其主线程通过tcp与远程服务器通信并获取一些数据。在建立tcp连接之前,主线程产生一个新线程,其中包括打印主线程获得的数据。
这是关于并行线程如何做到的一些伪代码 -
while (1)
{
if(dataObtained)
{
printDataFromMainThread(remoteData);
exit;
}
}
在主线程中:
recvOverTCPSocket();
saveData(remoteData);
dataObtained = true;
我最初担心这不是线程安全的,当我们运行这个应用程序时,似乎没有任何问题。我仍然有我的顾虑。
很明显,只有当dataObtained标志为真时,并行线程才会读取数据...这只在所有数据保存后才会发生。这确保了并行线程在主线程仍在更新数据时不会读取数据。
但是,我仍然不确定这是否是正确的方法,以及我是否错过任何可能失败的情况。
任何输入/评论。以上代码段是否有助于我们在更新数据时避免使用信号量?
答案 0 :(得分:1)
从您的代码中看,您的并行线程似乎永远不会阻塞;这意味着当您的程序运行时,您的并行线程可能会耗尽其中一个计算机内核上的所有可用CPU周期。这通常是你想要避免的,因为效率非常低(例如,它会降低计算机上运行的其他程序的速度,而在电池供电的设备上会不必要地耗尽电池)。
你可以避免这种情况,例如通过在condition variable上使用并行线程块,主线程在数据准备就绪时会发出信号...但问题变成了,为什么你要使用多个线程?看起来你的程序没有从两个线程中获得任何好处,因为它们中只有一个在任何给定时间都在做有用的工作。为什么不让同一个线程同时执行TCP数据下载然后打印下载的数据?这将为您提供您正在寻找的顺序行为,并且更简单,更高效,更不容易出错。
答案 1 :(得分:0)
我会将布尔标志设为原子,否则它应该起作用
std::atomic<bool> dataObtained(false);
...
// in working thread
while (!dataObtained) { std::this_thread::yield(); }
// receive and print data