打印

多线程调度问题

[复制链接]
938|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pkat|  楼主 | 2012-7-23 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做音视频采集,出现这样的问题. 音频采集需要20ms调用一次,视频采集保证33ms调用一次;程序启动了两个线程,每个线程私有一个锁,两个线程启动后,出现这样的情况视频线程在处理的时候,音频线程进来处理,而且一下子处理2-3次,导致视频线程处理时间被拖得很长都达到了100ms,小弟认为认为音频线程处理完了一次,我调用sleep,把音频线程可能剩余的时间片时间,释放了,这个时候视频线程的优先级应该提高,优先获得执行才对,可为什么依旧是音频线程继续执行,(我知道 "线程调度具有不可预知的" 废话! 希望高手深入的解释下,最好能够提出如何优化执行
下面是程序部分源码
[code=C/C++]

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;
}

相关帖子

沙发
yybj| | 2012-7-23 22:17 | 只看该作者
用临界区让音频视频轮流处理。

使用特权

评论回复
板凳
baidudz| | 2012-7-23 22:20 | 只看该作者
每个线程私有一个锁:这个不明白。
一般需要加锁的地方是在两个线程公用的部分。
如果只是为了锁代码,临界区最简单的方法。
锁线程,事件,信号量,等
-
另外楼主的代码没看懂。
可以自己写一个调度算法,用来保证执行的优先级。
楼主可以参考微软的消息队列

使用特权

评论回复
地板
dfsa| | 2012-7-24 22:18 | 只看该作者
这代码字太小了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

2726

帖子

0

粉丝