要統計乙個整型陣列中3出現的次數,寫乙個並行程式:
#include#include
#include
#include
#include
#include
#include
#define arrlen 200000000 //
int型陣列的長度,我們的程式就是要統計這個陣列中元素3出現了多少次
struct padded_int*private_counter;
int counter=0;
int arr[arrlen]=;
pthread_mutex_t lock=pthread_mutex_initializer;
int max_threads=0; //
令最多開闢的執行緒數等於核數
/*用隨機數初始化陣列
*/void initarr()
/*從/proc/cpuinfo檔案中獲取cpu的核數
*/void getcorenum(int *num)
int cn=0;
char buf[256];
memset(buf,0x00,sizeof(buf));
while((fgets(buf,sizeof(buf),fp))!=null)
memset(buf,0x00,sizeof(buf));
}fclose(fp);
*num=cn;
printf("
您的計算機是%d核的\n
",cn);}/*
每個執行緒負責統計陣列的一段區域內3出現的次數
*/void *count_thread(void* id)
}printf("
private_counter[%d].value=%d\n
",index,private_counter[index].value);
pthread_mutex_lock(&lock);
counter+=private_counter[index].value;
pthread_mutex_unlock(&lock);}/*
序列方法統計3出現的次數
*/void count()
/*主函式
改進歷史:
由於自加執行並不是原子操作,所以在每個執行緒中counter++前要獲得互斥鎖。
頻繁地加鎖和解鎖會使執行效率降低。下面我們給每個執行緒乙個私有的計數器private_counter,計算結束後一次性更新全域性變數counter。
私有計數器private_counter從int演變為struct padded_int的原因是:int型的private_counter並不是真正私有的。cache一致性協議兩個處理器看到的儲存映象是相同的。cache一致性的單位是cache行,本機有cahche行大小是64位元組(我猜是這樣的,因為/proc/cpuinfo檔案中寫著:cache_alignment: 64 )。private_counter[0]和private_counter[1]被放在了同乙個cache行中,對cache行中任一部分的修改等同於對整個cache行的修改。邏輯上不同的資料共享cache行的現象叫做假共享。所以當處理器1修改private_counter[0]之前,處理器2必須把自己手中相應的cache行廢棄掉;當處理器1修改完private_counter[0]之後,處理器2再能重新獲取private_counter[1]所在的cache行的操作權。為了不讓private_counter[0]和private_counter[1]在同了個cache行內,所以把它們都填充成了64位元組。
現在的體系結構已經可以把多執行緒對映到不同的處理器上,可為什麼平行計算的速度還是沒有序列的快呢?
為什麼並行沒有比序列快?
要統計乙個整型陣列中3出現的次數,寫乙個並行程式 include include include include include include include define arrlen 200000000 int型陣列的長度,我們的程式就是要統計這個陣列中元素3出現了多少次 struct pad...
epoll為什麼快
epoll是linux下的一種i o多路復用的操作方式,是event poll的意思 i o多路復用,舉個栗子,在酒吧,乙個服務員,10個顧客在喝酒,服務員有這麼幾種服務方式 服務員從第乙個顧客開始問,你要酒嗎,再問第二個,你要酒嗎,依次問下去,問完一圈,再從頭開始,服務員就是不停的在bbb,要酒嗎...
kafka 為什麼快
一般的 mq 每個訊息都有乙個狀態,這樣每個訊息狀態改變都要更新,增加了很多隨機讀寫。kafka 對每個 partition 只有乙個指標,而不是儲存每個訊息的狀態,所有在指標後面的訊息都是被消費過的訊息。這就去掉了很多 確認訊息 動作的隨機讀寫,通過一次移動指標,來確認多個訊息。很多訊息中介軟體,...