我的程序有一个后台线程来填充和交换双缓冲区实现的后台缓冲区。主线程使用前端缓冲区发送数据。问题是当我运行程序时,主线程平均获得更多的处理时间。我想要相反的行为,因为填充后台缓冲区是一个比处理数据并将数据发送到客户端更耗时的过程。
如何在 Linux 上使用 C POSIX pthreads 实现这一点?
我的程序有一个后台线程来填充和交换双缓冲区实现的后台缓冲区。主线程使用前端缓冲区发送数据。问题是当我运行程序时,主线程平均获得更多的处理时间。我想要相反的行为,因为填充后台缓冲区是一个比处理数据并将数据发送到客户端更耗时的过程。
如何在 Linux 上使用 C POSIX pthreads 实现这一点?
根据我的经验,如果在没有优先级的情况下,您的主线程正在获得更多 CPU,那么这意味着以下两件事之一:
与您的预期相反,它实际上需要额外的时间,或者
后台线程被饿死,可能是由于锁争用
改变优先级并不能解决其中任何一个问题。
看看 pthread_setschedparam() --> http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_setschedparam.3.html
pthread_setschedparam(pthread_t thread, int policy,
const struct sched_param *param);
您可以在 sched_param 的 sched_priority 字段中设置优先级。
你应该看看pthread_attr_t
结构。它作为参数传递给pthread_create
函数。它用于更改线程属性,可以帮助您解决问题。
如果你不能解决它,你将不得不使用互斥锁来防止你的主线程在你的其他线程交换它之前访问你的缓冲区。
使用pthread_setschedprio(pthread_t thread, int priority)
. 但是在其他情况下(setschedparam 或使用 pthread_attr_t 时),如果您想更改优先级(如 nice 实用程序),您的进程应该在 root 下启动。