我寫了一個小案例來測試多線程生產者/消費者模型。我的測試平臺是一款低性能PC(8G內存,J1900四核CPU)。我隔離了Linux內核的核心0,核心1-3沒有使用。生產者線程在覈心1上運行,分配5000000個小對象,將它們放到全局隊列中。消費者線程在覈心2上運行,並從隊列中釋放對象。但是我發現如果我沒有設置它們的CPU親和性(即它們運行在相同的核心0上),那麼時間性能會比設置CPU親和性(8.76s VS 14.66s)好。測試結果保持相似。有人能解釋我的原因嗎?如果我的前提不正確(「設置CPU關聯性可以提高多線程進程的性能」),則至少不應該變得更糟。我的代碼片段如下:
void producer() {
Timestamp begin;
for (int i = 0; i<data_nb; ++i) {
Test* test = new Test(i, i+1);
queue.enqueue(test);
}
Timestamp end;
TimeDuration td = end-begin;
printf("producer: %ldms(%.6fs)\n", td.asMicroSecond(), td.asSecond());
}
void consumer() {
Timestamp begin;
do {
Test* test = queue.dequeue();
if (test) {
nb.add(1); // nb is an atomic counter
delete test;
test = nullptr;
}
} while (nb.get() < data_nb);
Timestamp end;
TimeDuration td = end-begin;
//printf("%d data consumed\n", nb.get());
printf("consumer: %ldms(%.6fs)\n", td.asMicroSecond(), td.asSecond());
}
未能設置線程關聯並不能保證線程必須使用核心0. –
請參閱http://stackoverflow.com/questions/39141897/setting-the-affinity-causes-increase-in-execution-time – UmNyobe
人們在理論上通常會認爲設置線程關聯會有所幫助。他們很少檢查。很少有人做檢查會感到驚訝。 – Slava