gpt4 book ai didi

c - OS X 中的多线程 C 程序比 Linux 慢得多

转载 作者:IT王子 更新时间:2023-10-28 23:54:30 26 4
gpt4 key购买 nike

我为我已经完成并提交的 OS 类作业写了这篇文章。我昨天发布了这个问题,但由于“学术诚信”规定,我在提交截止日期之后才将其取消。

目标是学习如何使用临界区。有一个 data 数组,其中包含 100 个单调递增的数字,0...99,以及 40 个线程,每个线程随机交换两个元素 2,000,000 次。 Checker 每秒检查一次并确保每个数字中只有一个(这意味着没有发生并行访问)。

这是 Linux 时代:

real    0m5.102s
user 0m5.087s
sys 0m0.000s

和 OS X 时代

real    6m54.139s
user 0m41.873s
sys 6m43.792s

我在运行 OS X 的同一台机器上运行一个带有 ubuntu/trusty64 的 vagrant box。它是一个四核 i7 2.3Ghz(最高 3.2Ghz)2012 rMBP。

如果我理解正确,sys 是系统开销,我无法控制它,即便如此,41s 的用户时间表明线程可能是串行运行的。

如果需要,我可以发布所有代码,但我会发布我认为相关的部分。我正在使用 pthreads,因为这是 Linux 提供的,但我假设它们可以在 OS X 上运行。

创建 swapper 线程以运行 swapManyTimes 例程:

for (int i = 0; i < NUM_THREADS; i++) {
int err = pthread_create(&(threads[i]), NULL, swapManyTimes, NULL);
}

Swapper 线程临界区,在 for 循环中运行 200 万次:

pthread_mutex_lock(&mutex);    // begin critical section
int tmpFirst = data[first];
data[first] = data[second];
data[second] = tmpFirst;
pthread_mutex_unlock(&mutex); // end critical section

只创建一个Checker线程,与Swapper相同。它通过遍历 data 数组并用 true 标记对应于每个值的索引来运行。之后,它检查有多少索引是空的。因此:

pthread_mutex_lock(&mutex);
for (int i = 0; i < DATA_SIZE; i++) {
int value = data[i];
consistency[value] = 1;
}
pthread_mutex_unlock(&mutex);

它在运行完 while(1) 循环后通过调用 sleep(1) 每秒运行一次。在加入所有 swapper 线程后,该线程将被取消并加入。

我很乐意提供任何更多信息,以帮助弄清楚为什么这在 Mac 上如此糟糕。我并不是真的在寻求代码优化方面的帮助,除非那是 OS X 的绊脚石。我已经尝试在 OS X 上同时使用 clanggcc-4.9 来构建它.

最佳答案

MacOSX 和 Linux 实现 pthread 的方式不同,导致了这种缓慢的行为。特别是 MacOSX 不使用自旋锁(根据 ISO C 标准,它们是可选的)。对于像这样的示例,这可能会导致非常非常慢的代码性能。

关于c - OS X 中的多线程 C 程序比 Linux 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28888719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com