我对多线程编程知之甚少。我的C ++程序我制作10个pthreads,每个pthreads负责处理流向系统的部分实时数据。最终在main()内部,合并来自所有线程的已处理数据。据我所知,可并行运行的线程的确切数量由每个插槽的内核数量x每个插槽的线程数x套接字确定,在我的情况下为8(4 x 2 x 1)。那么在我的应用程序中有10个线程没有发生腭化并且不同线程之间的交换是调度程序的作用吗?如果没有,有什么办法可以确定吗?或者至少我可以知道这次交换需要多少毫秒?由于我的应用程序处理的是实时数据,因此确保所有线程并行运行至关重要。
答案 0 :(得分:1)
"据我所知,确切的线程数......"
某种类型的东西,还有超线程的东西;而且还有C ++可以在非PC上运行的事实。 (即嵌入式设备)将具有静态编号。
"是调度程序的功能"
是。但不只是你的线程;所有线程,操作系统和其他应用程序也都受此控制。
或者至少我可以知道这次交换需要多少毫秒
没有;并且它也不重要,因为你无法做任何事情。您可以做的最好的事情是尝试跟踪您的线程上有多少CPU时间,计算出单个线程可用的总CPU时间;然后你可以计算出你有多少时间;但同样,你不应该这样做,因为这可能意味着你的程序正在担心它之外的事情的控制。更有意义的是监视机器的CPU使用情况。
由于我的应用程序处理的是实时数据,因此它至关重要 确保所有线程并行运行。
关于你的线程是如何运行的,并不取决于你;它取决于操作系统。您的计算机上还有其他比您的程序更重要的任务。例如,操作系统需要处理时间来处理应用程序对内存的任何请求。
有些操作系统实际上能够以更专业的方式做到这一点;例如Qnix是一个实时操作系统;但这需要付出其他代价。
你可以确定一件事;如果你有一个最大数量的可能线程运行为8;你创造10;你不会让它们全部并行运行。您可能希望查看一些有助于确保您创建的线程始终处于忙碌状态的库;例如boost::asio
答案 1 :(得分:-1)
我无法添加评论,所以请回答。
或者至少我可以知道这次交换需要多少毫秒
在Windows上,这默认为10 - 20 ms 通过一个小技巧,您可以将其更改为1 - 2 ms
#include <Mmsystem.h>
#pragma comment(lib,"winmm.lib")
timeBeginPeriod(1); // set system clock to 1ms from default 10ms
如果你想添加另一个肮脏的技巧,让你的过程更有力量。 你需要在main()过程中添加下面两行,你还需要为每个线程做第二行。
SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);
警告!!!! 如果使用更多线程而不是处理核心,则会使窗口无响应。所以你需要在线程中给系统一些时间。
在Linux上,默认值已经是1 ms(动态),但您可以在不同的调度程序之间进行更改。