gpt4 book ai didi

c++ - 处理线程失控问题的线程新手

转载 作者:太空狗 更新时间:2023-10-29 22:52:53 25 4
gpt4 key购买 nike

好的,为了你明白我会解释这个问题:我正在使用一个名为 ClanLIB 的库(不是我的选择),该库 SEEMLY(我不确定,甚至阅读了源代码)创建了一个处理声音的线程。

当缓冲区为空时,此线程会尝试获取更多数据,这通常会在数据生成库速度太慢而无法在声卡到达缓冲区末端之前提供更多数据时导致数据不足。

所以我添加了自己的线程,它不断在后台生成声音。

这工作正常,除了我自己的线程有时会劫持过多的 CPU 时间并卡住其他一切。为了修复它,我添加了一个有条件的等待。

当缓冲区已满时会发生条件等待,当 ClanLIB 请求更多数据时,会发出等待信号,因此缓冲区写入线程会恢复(直到再次满)。

我的问题是,由于我添加了这个条件等待、ClanLIB 声音线程和我自己的音乐线程,所以有时会“失控”,在应用程序的其余部分卡住时播放音乐。

什么样的奇怪情况会导致这种情况?

伪代码:

//main thread (that get frozen)
start_sound_thread();
do_lots_of_stuff();
quit();

//Sound Thread:

While(true)
{
play(buffer);
if(buffer_empty)
{
mutex.lock()
buffer = buffer2;
if(buffer2_full)
{
signal(cond1);
buffer2_full = false;
}
mutex.unlock()
}
}

//Music Library Thread:

while(true)
{
mutex.lock()
if( check_free_space(buffer2) == 0)
{
buffer2_full = true;
condition_wait(cond1);
}
write_music(buffer2);
mutex.unlock()
}

最佳答案

您在互斥区内做的太多了——您很可能在 cond1 信号上陷入僵局。你应该在锁定区域内尽可能少地做,因为你做的越多,你引入死锁的风险就越大 - 你绝对不应该等待保护信号发送的互斥锁内部的信号 - 如果你'正在等待,它永远不会被发送 - condition_wait 没有解锁您的互斥对象,它怎么知道的?

'通过添加条件等待解决'是一个强有力的指标,表明你有一个导致死锁的竞争条件 - 你还没有解决问题,只要你的逻辑的执行时间因任何原因发生变化,比如说因为另一个应用程序正在运行,死锁可能会返回。

关于c++ - 处理线程失控问题的线程新手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463663/

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