日期:2014-05-16  浏览次数:20589 次

linux如何主动将线程放入到线程调度队列中重新排队?
如题,平台时linux 32位嵌入式系统,我想在让一个线程将临界区(通讯输入用的环形缓冲区的输入时将环形缓冲区锁定)解锁后主动放弃自己线程的CPU控制权,以便让另一线程(从通讯输入的环形缓冲区取出数据)有机会获得运行的机会,不能使用usleep(times)函数,因为我不知道usleep休眠参数填多少时间合适(它的合适取决于输入的通讯量大小。这个通讯量在分布式系统中不由程序决定,由分布式设备的数量和这些设备该时刻的信息上传状态(人为输入+报警输入)决定)。
1.如果让cpu主动休眠时间过长将影响环形缓冲区的输入线程的响应速度,造成数据量大时输入数据响应迟钝,系统通讯的输入容量不能最大化。
2.如果让cpu主动休眠时间过短,usleep(times)函数好像是到了times这个参数的时间后(基本误差时间不太大,至少误差时间可以接受)就开始恢复该线程运行,这样时间短了,还是达不到让输入线程休眠,以便让输出的线程有机会从环形缓冲区取走数据的机会。
linux如何主动将线程放入到线程调度队列中重新排队,就是主动放弃CPU控制权而不给出具体点时间参数将该线程放入到线程调度队列中重新排队的函数?这样的话系统将自动能达到它能处理的最大通讯容量。
大家遇到这样的需求时有什么好的思路,给个建议?

------解决方案--------------------
线程没怎么写过,貌似用信号灯实现的互斥是排队的
------解决方案--------------------
用信号量和条件变量,一起来决定thread sleep或者wakeup。
这种用法既可以用在线程互斥,又可以根据条件让线程睡眠和唤醒。