读书人

多线程调度困惑

发布时间: 2013-04-09 16:45:09 作者: rapoo

多线程调度困惑 高手请进
最近小弟做音视频采集,出现这样的问题. 音频采集需要20ms调用一次,视频采集保证33ms调用一次;程序启动了两个线程,每个线程私有一个锁,两个线程启动后,出现这样的情况视频线程在处理的时候,音频线程进来处理,而且一下子处理2-3次,导致视频线程处理时间被拖得很长都达到了100ms,小弟认为认为音频线程处理完了一次,我调用sleep,把音频线程可能剩余的时间片时间,释放了,这个时候视频线程的优先级应该提高,优先获得执行才对,可为什么依旧是音频线程继续执行,(我知道 "线程调度具有不可预知的" 废话! 希望高手深入的解释下,最好能够提出如何优化执行,拜谢下先.)

下面是程序部分源码
[code=C/C++]
[size=10px]
typedef struct _ThreadInfo{
HANDLE mutex;
HANDLE thread;
}ThreadInfo;

void* thread_proc(void* param){
ThreadInfo *ti = (ThreadInfo*)param;
WaitForSingleObject(ti->mutex,0);
while(ti->run){
for(i=0;i<ti->var;i++)
{
function_var(ti,i);
}
while(1){
unsigned long diff;
ReleaseMutex(ti->mutex);
realtime = ti->get_cur_time() - orig;
time += 1;
diff = realtime - time;
if(diff < 0)
{

log_debug("%s we are in advanced %d ms,sleep",ti->name,diff);
Sleep(diff);
}else{
log_debug("%s we are late of %d ms",ti->name,diff);
Sleep(0);
break;
}
WaitForSingleObject(ti->mutex,0);
}
WaitForSingleObject(ti->mutex,0);

}
ReleaseMutex(ti->mutex);
CloseHandle(ti->thread);
log_debug("%s thread exiting",ti->name);
return NULL;
}

[解决办法]
每个线程私有一个锁:这个不明白。
一般需要加锁的地方是在两个线程公用的部分。
如果只是为了锁代码,临界区最简单的方法。
锁线程,事件,信号量,等
-
另外楼主的代码没看懂。
可以自己写一个调度算法,用来保证执行的优先级。
楼主可以参考微软的消息队列。
[解决办法]
加锁进行并发控制
[解决办法]
现实就是,程序来不及处理,怎么都会延迟的,
不是延迟在音频线程,就是延迟在视频线程。

楼主的意思,应该用某种手段,让两个线程的延迟均等对待,要延迟大家音频视频一起延迟。
这不难道做,只要精确统计两个线程的帧数比例,就一定能达到目标。

然而,个人认为,楼主现在的状况反而是最好结果呢。
现实的项目,系统效率不行时,总是希望优先保证听觉连贯。


[解决办法]
《Windows核心编程》

读书人网 >C++

热点推荐