Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程争用下等待的最快方法_C++_Optimization_Pthreads_Wait - Fatal编程技术网

C++ 线程争用下等待的最快方法

C++ 线程争用下等待的最快方法,c++,optimization,pthreads,wait,C++,Optimization,Pthreads,Wait,我在Linux上使用pthread。我有一个循环缓冲区将数据从一个线程传递到另一个线程。也许循环缓冲区不是这里使用的最佳结构,但是改变它不会消除我的问题,所以我们将它称为队列 无论何时我的队列已满或为空,pop/push操作都返回NULL。这是有问题的,因为我的线程会定期启动。等待另一个线程循环将花费太长时间 我尝试过使用信号量(sem_post,sem_wait),但在争用下解锁需要25毫秒,这与我的循环速度差不多。我尝试过使用pthread_cond_____________________

我在Linux上使用pthread。我有一个循环缓冲区将数据从一个线程传递到另一个线程。也许循环缓冲区不是这里使用的最佳结构,但是改变它不会消除我的问题,所以我们将它称为队列

无论何时我的队列已满或为空,pop/push操作都返回NULL。这是有问题的,因为我的线程会定期启动。等待另一个线程循环将花费太长时间

我尝试过使用信号量(sem_post,sem_wait),但在争用下解锁需要25毫秒,这与我的循环速度差不多。我尝试过使用pthread_cond____________________________________

是否有一种更快的机制可以用来等待数据

编辑*


好的,我使用了条件变量。我使用的是嵌入式设备,所以添加“更多内核或cpu电源”不是一个选项。这让我意识到,我在所有地方都设置了各种线程优先级,所以在继续之前,我将对其进行排序。

您应该使用条件变量。唯一更快的方法是特定于平台的,它们的速度也只是可以忽略不计

仅仅因为线程被取消调度,您就会看到您认为性能差的情况。当线程接近其时间片的末尾时,您会看到很长的“延迟”,调度程序允许未阻塞的线程抢占正在运行的线程。如果内核多于线程,或者将线程设置为更高的优先级,则不会看到这些延迟


但是这些延迟实际上是一件好事,你不应该担心它们。其他线程也有机会运行。

您应该使用条件变量。唯一更快的方法是特定于平台的,它们的速度也只是可以忽略不计

仅仅因为线程被取消调度,您就会看到您认为性能差的情况。当线程接近其时间片的末尾时,您会看到很长的“延迟”,调度程序允许未阻塞的线程抢占正在运行的线程。如果内核多于线程,或者将线程设置为更高的优先级,则不会看到这些延迟


但是这些延迟实际上是一件好事,你不应该担心它们。其他线程也有机会运行。

您一定是严重误用了这些同步功能,或者严重误测了它们的行为,以找到这些时间类型。条件变量是你能做的最好的,它们实际上是瞬时的。你是如何使用它们的,也许更重要的是,你是如何测量的?我用clock_gettime(clock_REALTIME,&time)来测量,在释放锁之前和之后,您是否碰巧在同一行/函数调用中获得了结束时间,您执行I/O来记录它?@Eric,这只是测量线程再次获得CPU之前的时间。这并不能衡量释放锁需要多长时间。很可能您有比内核更多的线程可以运行,在这25毫秒内,其他一些线程运行。(您可以通过测量优先级高于其他线程的线程来确认这一点。)如果处理循环需要25毫秒,则使用哪种同步机制来管理数据队列并不重要(假设该机制工作,即不执行CPU循环,不错过推送/弹出)。锁释放时间、interlockedBlahBlah、信号量调用、condvar等待/信号、上下文更改等只是25ms内的一点噪音。我假设您正在队列中推/弹出指针/实例,而不是复制大型结构体?您一定是严重误用了这些同步函数,或者严重误测了它们的行为以找到这些类型的时间。条件变量是你能做的最好的,它们实际上是瞬时的。你是如何使用它们的,也许更重要的是,你是如何测量的?我用clock_gettime(clock_REALTIME,&time)来测量,在释放锁之前和之后,您是否碰巧在同一行/函数调用中获得了结束时间,您执行I/O来记录它?@Eric,这只是测量线程再次获得CPU之前的时间。这并不能衡量释放锁需要多长时间。很可能您有比内核更多的线程可以运行,在这25毫秒内,其他一些线程运行。(您可以通过测量优先级高于其他线程的线程来确认这一点。)如果处理循环需要25毫秒,则使用哪种同步机制来管理数据队列并不重要(假设该机制工作,即不执行CPU循环,不错过推送/弹出)。锁释放时间、interlockedBlahBlah、信号量调用、condvar等待/信号、上下文更改等只是25ms内的一点噪音。我假设您正在推/弹出队列中的指针/实例,而不是复制大型结构?时间段与锁无关。锁在第一毫秒内被释放。另一次是线程没有运行,因为系统正在做其他事情。+1对于David-盒子过载。需要更多内核(可能更多RAM),CPU密集型应用程序更少。另外,对于Billy-25us来说+1,更不用说ms了,对于一个锁释放来说太长了。时间段与锁无关。锁在第一毫秒内被释放。另一次是线程没有运行,因为系统正在做其他事情。+1对于David-盒子过载。需要更多内核(可能更多RAM),CPU密集型应用程序更少。另外,对于Billy-25us来说+1,更不用说ms了,对于一个锁释放来说太长了。