【发布时间】:2016-11-15 10:27:45
【问题描述】:
我正在使用 PortAudio 的回调 API 来设计信号处理环回库。
我想在回调中添加一个依赖于标志的分支,就像
int pa_callback(const void *inputuffer,
void *outputBuffer,
unsigned long frameCount,
const PaStreamCallbackTimeInfo *timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData)
{
if (do_something_flag) {
do_something(inputBuffer, outputBuffer, frameCount);
} else {
do_something_else(inputBuffer, outputBuffer, frameCount);
}
return paContinue;
}
do_something_flag 定期在我的程序中的其他位置设置。
PortAudio 回调文档指出:
在我们开始之前,重要的是要意识到回调是一个 微妙的地方。这是因为一些系统在一个 特殊的线程,或中断处理程序,它很少被处理 与您的其余代码相同。对于大多数现代系统,您不会 能够通过在回调中进行不允许的调用来导致崩溃,但是 如果您希望您的代码产生无故障的音频,则必须 确保避免可能需要无限量的函数调用 执行的时间。这些到底是什么取决于您的平台,但是 几乎可以肯定包括以下内容:内存 分配/解除分配,I/O(包括文件 I/O 以及控制台 I/O,如 printf()),上下文切换(如 exec() 或 yield()), 互斥操作,或任何其他可能依赖于操作系统的操作。如果你 认为简短的关键部分是安全的,请阅读优先级 倒置。
我不关心do_something_flag 的原子性。也就是说,我不在乎需要多少个周期才能获得正确的值(在合理范围内)。
根据文档,看起来我不能使用互斥锁来设置/读取该变量。
1) 我有哪些选择?
2) 如果我将其设为全局并将其设置在程序的另一部分(另一个线程)中,那么绝对最坏的情况是什么?再说一次,我的意思是指将数据损坏到程序故障/等等。
有正确的方法吗?
【问题讨论】:
标签: c thread-safety portaudio