多线程解决查询问题

时间:2015-01-05 03:18:13

标签: c++ multithreading

我有一个应用程序,其主线程通过tcp与远程服务器通信并获取一些数据。在建立tcp连接之前,主线程产生一个新线程,其中包括打印主线程获得的数据。

这是关于并行线程如何做到的一些伪代码 -

while (1)
{
    if(dataObtained)
    {
        printDataFromMainThread(remoteData);
        exit;
    }
}

在主线程中:

recvOverTCPSocket();
saveData(remoteData);
dataObtained = true;

我最初担心这不是线程安全的,当我们运行这个应用程序时,似乎没有任何问题。我仍然有我的顾虑。

很明显,只有当dataObtained标志为真时,并行线程才会读取数据...这只在所有数据保存后才会发生。这确保了并行线程在主线程仍在更新数据时不会读取数据。

但是,我仍然不确定这是否是正确的方法,以及我是否错过任何可能失败的情况。

任何输入/评论。以上代码段是否有助于我们在更新数据时避免使用信号量?

2 个答案:

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