Mutex需要很长时间才能解锁

时间:2010-05-18 23:10:31

标签: pthreads mutex

我有两个主题。第一个是这样的:

while(1)
{
   pthread_mutex_lock(&mutex);
   //DO WORK
   pthread_mutex_unlock(&mutex);
   pthread_yield();
}

第二个锁定用户事件上的互斥锁,更改一些设置并解锁。线程1每秒进行约200次迭代。但有时它需要第二个线程最多3秒才能激活(锁定互斥锁)。如何确保更快的响应?

编辑 - 第二个帖子:

while(1)
{
   waitForUserInput(); // blocking call to linux input
   pthread_mutex_lock(&mutex);
   // Change some settings which are used by the first thread
   pthread_mutex_unlock(&mutex);
}

EDIT2 - 修正了问题(“解锁互斥锁” - >“以锁定互斥锁”)。

3 个答案:

答案 0 :(得分:1)

当我看到pthread_yield signal根据man page它是非标准的时候我总是很担心所以我一般都会避免这种情况,所以它实际上也没有给你任何保证,它会把你放在后面运行队列但这并不意味着其他任何东西都会运行,具体取决于操作系统如何优先处理您的线程。

您可能想要做的是使用条件变量wait和{{1}}

明确地将控制权交给另一个线程

答案 1 :(得分:1)

尝试将pthread_yield()更改为usleep(10)usleep(100)以确定产量是否会导致您出现问题,因为我看到过产量无效的情况,这会导致您的循环解锁并且重新锁定太快,以便第一个线程在大多数时间都能锁定它。如果你想要更多控制,你可以考虑在pthread中查看条件变量。

答案 2 :(得分:1)

你的设计很糟糕。线程只应在需要访问共享数据结构时才持有互斥锁。这应该是线程运行时间的一小部分,而不是绝大多数。如果你看到你正在开发的那种模式,那就该重新设计了。

一种可能的模式是让计算线程在没有持有互斥锁的情况下运行时保持指向全局数据的指针。然后,UI线程可以基于UI输入创建新版本的全局数据,然后将指针发布到新数据,以便计算线程在下次获取指针时看到它。这样,只要复制指针,计算线程只需要保持互斥锁。

以下是计算线程的过度简化布局:

pthread_mutex_lock(&mutex);
my_pointer = shared_pointer;
pthread_mutex_unlock(&mutex);
do_calculations();

对于UI线程,逻辑如下:您修改数据的副本。您制作数据的新副本。你获得了互斥量。您将shared_pointer更改为指向两个数据副本之一。你持有另一个副本来修改下一遍。