您现在的位置是:首页 > 编程开发 > Java > Java

多线程C程序在OS X比Linux慢得多

编辑:站长来源:互联网作者: 佚名2020-07-22Java

简介我写了一个我已经完成并交付的操作系统类的作业.我昨天发布了这个问题,但由于“学术诚信”的规定,我把它删除,直到提交截止日期. 对象是学习如何使用关键部分.有一个数据数组,100个单调增加的数字,0 … 99和40个线程,随机交换两个元素,每个元素2,000,000次.一

我写了一个我已经完成并交付的操作系统类的作业.我昨天发布了这个问题,但由于“学术诚信”的规定,我把它删除,直到提交截止日期.

对象是学习如何使用关键部分.有一个数据数组,100个单调增加的数字,0 … 99和40个线程,随机交换两个元素,每个元素2,000,000次.一次通过一个Checkergoes通过,并确保每个数字只有一个(这意味着没有并行访问发生).

这是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的流氓框.它是一个四核i7 2.3Ghz(高达3.2Ghz)2012 rMBP.

如果我理解正确,sys是系统开销,我无法控制,即使如此,41秒的用户时间表明线程可能连续运行.

我可以发布所有的代码,如果需要,但我会发布我认为相关的位.我使用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相同.它通过遍历数据数组并将与每个值相对应的索引标记为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)运行一次.所有交换线程加入后,线程也被取消并被连接.

我很乐意提供任何更多的信息,可以帮助您弄清楚为什么在Mac上这么多.我不是真正寻求代码优化的帮助,除非这是什么是绊倒OS X.我已经尝试使用clang和gcc-4.9在OS X上构建它.

解决方法

MacOSX和Linux实现pthread不同,导致这种缓慢的行为.具体而言,MacOSX不使用自旋锁(它们根据ISO C标准是可选的).这可能导致非常非常慢的代码性能与这样的示例.

很赞哦! ()