我找不到任何关于waveOut API的线程安全的信息。
在创建新的waveOut句柄之后,我拥有以下线程:
线程1:缓冲区处理。使用这些API函数:
线程2: Gui,控制器线程。使用这些API函数:
这两个线程同时使用相同的waveOut句柄运行。在我的测试中,我没有发现这个功能有任何问题,但这并不意味着它是安全的。
这个架构线程安全吗?有关于waveOut API的线程安全的文档吗?还有其他关于waveOut API线程安全的建议吗?
谢谢。
发布于 2009-12-10 06:30:17
我也没有看到任何文档,但我无法想象对waveOutWrite的调用与在同一个句柄上对WaveOutRestart的调用同时运行是安全的。
如果您正在使用VS2010 Beta2,我将查看代理库的各种演练,并尝试将其转化为生产者消费者问题,在这里您正在传递诸如写、暂停、重新启动等消息。
如果您没有使用Visual 2010 (或者不能使用),我将鼓励您找到一种方法,使用线程和存储要处理的命令的某种内部同步队列将其分解为生产者消费者问题。如果消息不是那么频繁,并且您只有两个线程在这个队列上工作,那么您就可以在std::Win32周围放置一个普通的旧的关键部分。
希望这能有所帮助。
发布于 2009-12-18 12:15:11
发布于 2009-12-16 01:28:41
它可能是线程安全的,但是如果您(或我)找不到任何说明它是线程安全的正式文档,那么假设它不是,并添加您自己的线程同步。一个轻量级的EnterCriticalSection / LeaveCriticalSection实现可能不超过十几行代码。
任何数量的测试都无法保证API是线程安全的:问题可能只发生在某些具有一定CPU或总线速度的体系结构上,或者只出现在一些声卡上。您(或Microsoft)都没有能力测试所有可能的配置。
您也不应该对微软、英特尔、声卡制造商或驱动程序编写者在将来的实现中会做什么做任何假设。
https://stackoverflow.com/questions/1877210
复制相似问题