关于网友提出的“ 多线程的问题”问题疑问,本网通过在网上对“ 多线程的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 多线程的问题
描述: 有这两个方法
void* AudioControl::play(void* arg)
{
this->playSound(AudioSourceList::MUSIC_warCraft);
return NULL;
}
void* AudioControl::init(void* arg)
{
FMOD::System_Create(&Audio);
Audio->init(100, FMOD_INIT_NORMAL, 0);
Audio->createSoundGroup("Music Group", &musicGroup);
Audio->createChannelGroup("Music Channel", &musicChannelGroup);
Audio->createSoundGroup("Sound Group", &soundGroup);
Audio->createChannelGroup("Sound Channel", &soundChannelGroup);
soundChannelGroup->setVolume(soundVolume);
musicChannelGroup->setVolume(musicVolume);
return NULL;
}
第一个是播放音乐,第二个是音乐的一些初始化操作,
在一开始我用
pthread_create(&threadId, NULL, init, NULL)
来初始化一些东西,之后用pthread_create(&threadId, NULL, play, NULL)来播放背景音乐,但是没有声音,如果我一次性的把初始化和播放都放到ini里面,也就是说把
this->playSound(AudioSourceList::MUSIC_warCraft);
放到ini的最后的话,可以播放声音,这个是为什么?
解决方案1: 两个线程并发运行导致第一个线程初始化尚未完成时,第二个线程就开始播放,结果造成播放失败。
如果每次播放前都要做依次初始化的话,就没必要做成并发的
如果一次初始化对应多次播放,则线程间应该做必要的同步
解决方案2: 用个全局的flag,在init完成后置为true,在playSound前循环检查是否为true。
解决方案3: pthread_create(&threadId, NULL, play, NULL)之后sleep(1)试试
解决方案4: 进程退掉了? 你join子线程的子线程了吗?
以上介绍了“ 多线程的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2016146.html