gpt4 book ai didi

multithreading - 消费者和生产者之间的Qt线程释放? Qmutex? Q信号量?什么?

转载 作者:行者123 更新时间:2023-12-03 13:16:11 26 4
gpt4 key购买 nike

我有一个非常简单的情况:我在一个线程中有一个高速数据生成器,该线程生成其中包含[可变长度]元素的缓冲区。一旦缓冲区被填满,我就拥有一个将其写入磁盘的使用者。

现在,如果尚未由使用者线程写入缓冲区,则需要重新开始产生ASAP的生产者线程将旋转到位:

int volatile datatogo=0; // global with starting condition

while(datatogo != 0) // spin, buffer not yet written out
{
if (recflag == 0) return; // recording is terminated
}
// clipped code fills buffer, then:
datatogo = lengthoffill;

...在另一个线程中,缓冲区编写器执行以下操作:
    while(recflag)
{
if (datatogo)
{
if (m_File.write(sbuffer,datatogo) == -1)
{
recflag=0; // bail NOW
}
datatogo = 0; // buffer transferred
}
usleep(100); // 100 uS
}

这样做的最终结果是,写到磁盘的使用者在完成写操作后便放弃了CPU,因为它知道产生者必须花一些时间来实际填充缓冲区。消费者在没有数据的情况下处于 sleep 状态,因此生产者可以使用CPU。消费者 sleep 100 us,检查数据,然后在没有 sleep 的情况下返回 sleep 状态,因此在该状态下,除 sleep 外,它不会执行任何其他操作。

但是,由于 sleep 时间是任意的,因此不可能达到最佳状态。即使我仔细调整了它以使其在我的机器上工作(8核,3 GHz),它在另一台机器上的行为也会有所不同。有时可以准备写入数据,而消费者刚刚休眠,可以说整个100 us都丢到了窗外。我还对如此小的计时窗口的分辨率和可靠性感到不满-较大的窗口将不起作用。

所以。 Qt中有多种机制来控制对事物的访问,这实际上是我想要做的。但是我不知道哪个人(如果有的话)会做我想做的事,即:

1)让使用者进入休眠状态,直到缓冲区已满,然后写入并返回 sleep 状态,或者直到作业停止,以便它可以关闭文件(它可以检查唤醒时的文件)

2)当生产者仅在以及正在写出缓冲区时才进入休眠状态,否则填充缓冲区并返回产生其内容。

我需要尽可能多的CPU可用-这是一个软件定义的 radio 应用程序,数据无处不在,运行着多个FFT,各种形式的图形处理都在发生,等等。旋转时间太糟糕了,太糟糕了。

某种灵魂可以将我指向使用理想的Qt机制吗?我发现QMutex,QWaitCondition,QSemaphore上的Qt文档是...有点不透明。

最佳答案

将整数变量标记为volatile不足以保证您在多线程程序中所需的保证:

Why is volatile not considered useful in multithreaded C or C++ programming?

如果您喜欢讲究基本原理,实际上可以使用原子整数和指针:

http://doc.qt.io/archives/qt-4.7/qatomicint.html

http://doc.qt.io/archives/qt-4.7/qatomicpointer.html

但是您确实想使用Qt的线程原语。与使用互斥锁,信号量和等待条件相比,旋转/ sleep 是浪费的。这些是您可以在任何线程库中找到的相当笼统的概念,因此,我将四处寻找有关它们的很好的解释。刚开始时脑海中并不容易的东西,但是一个人需要知道!

QWaitCondition的生产者/消费者示例应针对您的方案进行说明:

http://doc.qt.io/qt-4.8/qt-threads-waitconditions-example.html

关于multithreading - 消费者和生产者之间的Qt线程释放? Qmutex? Q信号量?什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10195149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com