非先发制人的Pthreads?

时间:2011-09-23 12:44:12

标签: linux multithreading pthreads

有没有办法在没有调度程序的情况下使用pthreads,所以只有当一个线程明确地产生或者在互斥锁/ cond上被阻塞时才会发生上下文切换?如果没有,是否有办法最小化调度开销,以便尽可能少地发生强制上下文切换?

问题是指POSIX线程的Linux gcc / g ++实现。

2 个答案:

答案 0 :(得分:4)

您可以使用非抢占式线程库Pth(a.k.a。GNU Portable Threads)。使用--enable-pthread配置它将为pthreads创建插件替换。我刚刚在我的Mac上构建并测试了它,它适用于简单的pthreads程序。

来自自述文件:

  

Pth是一个非常便携的基于POSIX / ANSI-C的Unix平台库     它为多个提供非抢先的基于优先级的调度     事件驱动中的执行线程(又称“多线程”)     应用。所有线程都在服务器的相同地址空间中运行     应用程序,但每个线程都有自己独立的程序计数器,     运行时堆栈,信号掩码和errno变量。

     

线程调度本身是以合作的方式完成的,即     线程由基于优先级和事件的非抢占式管理     调度。意图是,通过这种方式可以实现更好的目标     可移植性和运行时性能比抢占式调度。     事件工具允许线程等到各种类型的     发生事件,包括filedescriptors上的挂起I / O,异步     信号,已用定时器,消息端口上的待处理I / O,线程和     进程终止,甚至是自定义的回调函数。

     

此外,Pth为POSIX.1c提供了可选的仿真API     线程(`Pthreads'),可用于向后兼容     现有的多线程应用程序。

答案 1 :(得分:0)

如果您的进程在普通用户区运行,则上下文切换自然会作为系统操作的一部分发生 - 总有另一个进程需要CPU时间。线程之间的抢占式上下文切换已经由操作系统进行了很好的优化,并且有时必然是必要的。

如果你真的碰巧遇到了过多的上下文切换问题,那么你最好首先调整Linux调度程序,这在这里是偏离主题的。 pthread_setschedprio和pthread_setschedparam可以设置一些提示,但仅限于设置优先级,这些优先级的解释是实现定义的,即直到Linux调度程序。