我有一个在我的多线程程序中修改共享资源的函数。这个函数是线程接触共享资源的唯一地方,它只用于每个线程整体工作的一小部分。
static int64_t
AddToSharedResource(volatile int64_t* value, int64_t to_add)
{
int64_t result = *value;
*value += to_add;
return result;
}
我想让我的应用程序线程安全,所以我在指令之间添加了一个简单的互斥锁。
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static int64_t
AddToSharedResource(volatile int64_t* value, int64_t to_add)
{
pthread_mutex_lock(&lock);
int64_t result = *value;
*value += to_add;
pthread_mutex_unlock(&lock);
return result;
}
这样做会使我的程序慢 10 倍以上,甚至比单线程版本还要慢!
在阅读了更多之后,这似乎是因为 macOS 实现,它使用“公平”互斥锁而不是使用自旋锁,并且实现之间存在一定的权衡,但这种情况是表现不佳的情况之一。但是,我以这种方式编写代码的原因是我已经在 Win32 中编写了程序(锁定几乎不会造成任何性能损失),并且我也计划将该功能移植到 Linux。
有没有办法让这个函数在 macOS 中线程安全而不会造成巨大的瓶颈,还是我需要重新设计平台层?