我對多執行緒有疑問。這段代碼是關于比較單執行緒與多執行緒的簡單示例。(單執行緒與 4 多執行緒的總和為 0~400,000,000)
//Single
#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#define NUM_THREAD 4
#define MY_NUM 100000000
void* calcThread(void* param);
double total = 0;
double sum[NUM_THREAD] = { 0, };
int main() {
long p[NUM_THREAD] = {MY_NUM, MY_NUM * 2,MY_NUM * 3,MY_NUM * 4 };
int i;
long total_nstime;
struct timespec begin, end;
pthread_t tid[NUM_THREAD];
pthread_attr_t attr[NUM_THREAD];
clock_gettime(CLOCK_MONOTONIC, &begin);
for (i = 0; i < NUM_THREAD; i ) {
calcThread((void*)p[i]);
}
for (i = 0; i < NUM_THREAD; i ) {
total = sum[i];
}
clock_gettime(CLOCK_MONOTONIC, &end);
printf("total = %lf\n", total);
total_nstime = (end.tv_sec - begin.tv_sec) * 1000000000 (end.tv_nsec - begin.tv_nsec);
printf("%.3fs\n", (float)total_nstime / 1000000000);
return 0;
}
void* calcThread(void* param) {
int i;
long to = (long)(param);
int from = to - MY_NUM 1;
int th_num = from / MY_NUM;
for (i = from; i <= to; i )
sum[th_num] = i;
}
我想使用 4-MultiThread 代碼進行更改,所以我將計算函式更改為使用 MultiThread。
...
int main() {
...
//createThread
for (i = 0; i < NUM_THREAD; i ) {
pthread_attr_init(&attr[i]);
pthread_create(&tid[i],&attr[i],calcThread,(void *)p[i]);
}
//wait
for(i=0;i<NUM_THREAD;i ){
pthread_join(tid[i],NULL);
}
for (i = 0; i < NUM_THREAD; i ) {
total = sum[i];
}
clock_gettime(CLOCK_MONOTONIC, &end);
...
}
結果(在 Ubuntu 中) 但是,它比單功能代碼慢。我知道多執行緒更快。我不知道這個問題:(怎么了?你能給我一些建議嗎?非常感謝!
uj5u.com熱心網友回復:
“我知道多執行緒更快”
情況并非總是如此,因為通常您會以某種方式受到 CPU 的限制,無論是由于核心數量、在作業系統級別的調度方式以及硬體級別。
多少執行緒值得分配給一個行程是一個平衡,因為您可能會遇到一個舊的 Linux 問題,您將花費更多的時間來調度行程而不是實際運行它們。
由于這非常依賴于硬體和作業系統,因此很難確切說明問題可能是什么,但請確保您安裝了適合您的 CPU 的微碼(通常在 Ubuntu 中默認安裝),但以防萬一,請嘗試:
sudo apt-get install intel-microcode
否則,請查看正在運行的其他行程,可能是在分配該行程的核心上正在運行許多其他事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/480490.html
上一篇:如何僅使用系統呼叫創建鏈表
下一篇:如何包含一級目錄但排除二級目錄?
