线程优先级设置问题?

winxxpSoft 2008-06-02 11:32:57
我想把一个采集线程的优先级设的比存储线程高一些,因为有的时候存储线程影响采集线程!

默认线程的调试是SCHED_OTHER,可它没有优先级可调!从这可以看出,都是0。
	printf("thread max:%d, min:%d\n", sched_get_priority_max(SCHED_OTHER), sched_get_priority_min(SCHED_OTHER));


我看书中用这几个函数:

pthread_attr_init()
pthread_attr_setschedpolicy()
pthread_attr_setschedparam()
pthread_attr_destroy()


它们是这样一个顺序使用吧?最后把attr这个参数传给线程建立函数吧?还是在建立好的线程里设置。

pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
pthread_attr_getschedparam(&attr, ¶m);
param.sched_priority=20;
pthread_attr_setschedparam(&attr, ¶m);
pthread_create(&tid, &attr, (void *)myfunction, myarg);

我是按上面使用的,可是程序进入后好像没有设置的线程都不动了,只设置了SCHED_RR的线程在走。

哪位能详细的说一下调用顺序?
最后再问一下pthread_setschedparam()这个函数怎么用?它和pthread_attr_getschedparam()是什么区别?先不胜感谢!
...全文
1749 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
winxxpSoft 2008-06-05
  • 打赏
  • 举报
回复
兄弟,怎么昨晚没见你上MSN?我加你了呀?收到我的代码了吗?
fuqd273 2008-06-04
  • 打赏
  • 举报
回复
因为它的流氓软件倾向,我拒绝使用QQ很久了。
msn: fuqd273@hotmail.com (晚上才上)
mail: 同上,公司邮箱有监管,受限。抱歉无法提供。

不过、我不认为你的代码有错误。呵呵,无法实现你的设计不见得是代码错误,也可能是是设计构架有缺陷。
winxxpSoft 2008-06-04
  • 打赏
  • 举报
回复
我单位只有两台机器可以上网,其他一率不准接外网!

我给把我的测试代码发过去,你测一下,我觉的没有问题!晚上联系你!
fuqd273 2008-06-03
  • 打赏
  • 举报
回复
采集线程如果也是使用IO操作的话,可能会有影响的。但是因为我没有做过嵌入式编程,硬件相关的东西没做过,这方面可能对你帮助不大。

几点考虑:
1、存储线程memcpy结束后就可以释放mutex了,因为与write无关了。
2、write是否应该是fwrite,这样系统能够帮你在IO空闲时进行写操作。
3、调整采集频率,或者减少写文件块的大小,使得两者影响最低。

先说这些,供参考。
winxxpSoft 2008-06-03
  • 打赏
  • 举报
回复
133634991这个是你的QQ吗?你加不了我,说你的好友太多了!!!!
winxxpSoft 2008-06-03
  • 打赏
  • 举报
回复
我是这样的。我给你一份我的队列缓冲源码,你帮我看看,我测的是没有错误!fuqd273,你在哪?我的信箱是haolei_vip@163.com。你给我个联系方式,明天上班给你!我的QQ:393222751!
悠悠长风 2008-06-02
  • 打赏
  • 举报
回复
我看你调用的顺序顺序应该没有什么问题啊。

pthread_setschedparam:设置线程调度参数;
pthread_attr_getschedparam:得到线程调度设置
winxxpSoft 2008-06-02
  • 打赏
  • 举报
回复
不多说,先谢!楼上。

今天我试,好像像你说的哪种情况!

我存储时都是先从队列缓冲中memcpy出来再write文件,这样的放就会释放mutex。我觉得我的缓冲队列没问题。可能是PC104板(型号是2410)的速度不够,好像在保存的时候采集线程有停顿的情况!是不保存的采集都是IO操作,相互有一点影响?不清楚了!
fuqd273 2008-06-02
  • 打赏
  • 举报
回复
线程1的优先级>线程2的优先级 的情况下

只要线程1在执行中,线程2就无法获得执行权。
除非线程1主动地暂时释放资源,线程2才会执行。

这是我的理解,未验证。
fuqd273 2008-06-02
  • 打赏
  • 举报
回复
示例如下:

存储区域1:FLAG=ON | 数据1 | 数据2 (存储线程使用区域)
存储区域2:FLAG=OFF | 数据3 (采集线程使用区域)
存储区域3:FLAG=OFF | 空数据
存储区域4:FLAG=OFF | 空数据
---------------------------------------------->
存储区域1:FLAG=ON | 数据1 | 数据2 (存储线程使用区域)
存储区域2:FLAG=ON | 数据3 | 数据4 | 数据5 (存储线程使用区域)
存储区域3:FLAG=OFF | 空数据 (采集线程使用区域)
存储区域4:FLAG=OFF | 空数据
---------------------------------------------->
存储区域1:FLAG=OFF | 空数据
存储区域2:FLAG=ON | 数据3 | 数据4 | 数据5 (存储线程使用区域)
存储区域3:FLAG=OFF | 数据6 (采集线程使用区域)
存储区域4:FLAG=OFF | 空数据

存储线程只对flag为ON的区域操作,对该区域处理结束就改成OFF;
采集线程只对flag为OFF的区域操作,对该区域处理结束就改成ON。
winxxpSoft 2008-06-02
  • 打赏
  • 举报
回复
对了,补充一下,我做的是一个其嵌入板的程序!
winxxpSoft 2008-06-02
  • 打赏
  • 举报
回复
太感谢fuqd273了,有点激动!

你说的大部分和我遇到的情况一样的。我用了两个环形缓冲存放采集数据和要存储的数据,还有一个线程是用来通过网络发送数据的。线程间的同步是用条件变量和mutex做的!

我试试减小存储数据量看郊果怎么样。对于你说的第2条我不太理解?
[Quote=引用 4 楼 fuqd273 的回复:]
2、建立swap区,多进程/线程处理swap区数据,减少存储时间损耗,例如,采用多个数据区来存放数据,存储线程只对写满的数据区进行存储操作,而采集线程只往未写满的数据区写入数据。这种做法是不需要线程间同步的。
[/Quote]

另外我不能只把一个线程改成SCHED_RR,我刚试把所有的线程都用这个调度,设置相同的优先级,发现和原来没看出有多大的区别,但是如果变了的放,就会出现问题,要么不采集,要么不存储。
fuqd273 2008-06-02
  • 打赏
  • 举报
回复
参考资料如下:
POSIX Thread Libraries
Migrate your apps from OS/2 to Linux
Thread Scheduling with pthreads under Linux and FreeBSD

这是我参考的一些资料。
希望对你有帮助。
fuqd273 2008-06-02
  • 打赏
  • 举报
回复
对于第二种方案补充说明一下

如果判断存储区是否写满的动作是一个粒子操作,例如判断1个flag是ON还是OFF,那么各个线程是不需要进行同步管理的。
理由如下
对于采集线程,跳过flag是ON的那块存储区,只对flag是OFF的存储区进行写操作,直到该区写满才将flag改为ON,交给存储线程进行处理,而他则继续找到一块新的flag是OFF的存储区进行写操作。
对于存储线程,则只对flag是ON的那块存储区进行存储动作,跳过所有flag是OFF的那块存储区,在把当前存储区处理完之后,才将flag改为OFF。

但是,在实际处理过程中,由于采用死循环检查flag的做法代码效率不高(一直死循环占用cpu资源),更多的处理方式是采用信号pthread_kill或者锁条件pthread_cond_signal/pthread_cond_broadcast/pthread_cond_wait/pthread_cond_timedwait等等做法来实现当实际需求产生以后才做事情。
fuqd273 2008-06-02
  • 打赏
  • 举报
回复
pthread_setschedparam()是修改现在正在执行中的线程,具体地说,就是在pthread_create之后才能使用。

pthread_attr_setschedparam是修改将要创建的线程的参数,在pthread_create就要使用了。

我的理解是,你正确的修改了线程的优先级,那么,采集线程的优先级就是最高的,在采集线程没有释放资源的前提下,存储线程很难得到cpu等系统资源。所以你观察到的现象就是:只设置了SCHED_RR的线程在走。
我的观点是:你的程序的确按照你设想的结果在执行中,所以,你的程序没有错。如果说,这个结果不是你想要的结果,那么,可以考虑如下方法:
1、调整存储参数、使得存储线程占用的单位时间变短,例如,减少每次存储的数据量
2、建立swap区,多进程/线程处理swap区数据,减少存储时间损耗,例如,采用多个数据区来存放数据,存储线程只对写满的数据区进行存储操作,而采集线程只往未写满的数据区写入数据。这种做法是不需要线程间同步的。
3、……(其他做法,不一一列举)


winxxpSoft 2008-06-02
  • 打赏
  • 举报
回复
先谢1,2楼,

1楼,不好意思,打错了!
[Quote=引用楼主 winxxpSoft 的帖子:]
pthread_setschedparam()这个函数怎么用?它和pthread_attr_setschedparam()的区别
[/Quote]

二楼能说的再详一些吗?比如用哪几个函数?谢!
fuqd273 2008-06-02
  • 打赏
  • 举报
回复
既然你想用线程优先级来管理,那不就是你想要得结果么?

被指定优先的线程占用了cpu,级别不够的线程要等指定线程释放资源才能执行。

对于这个结果有什么问题么?

引用
我想把一个采集线程的优先级设的比存储线程高一些,因为有的时候存储线程影响采集线程!

从你的现象上说,建议采用别的系统构架来避免问题。
可能的方法:
1、调整存储参数
2、建立swap区,多进程/线程处理swap区数据,减少存储时间损耗
3、……

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧