我写了一个我已经完成并交付的操作系统类的作业.我昨天发布了这个问题,但由于“学术诚信”的规定,我把它删除,直到提交截止日期.
对象是学习如何使用关键部分.有一个数据数组,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上构建它.