在進行多執行緒程式設計時,我們總會遇到全域性變數和資料結構的問題,這是多執行緒之間進行通訊的問題。如果多個執行緒同時讀寫乙個全域性變數,那麼會造成競爭或者出錯。為了解決這一問題,我們需要對全域性資料進行,使用互斥量實現鎖的機制,當某個執行緒在某個操作前進行了加鎖,那麼某個操作只能在這個執行緒進行,直至將鎖去除,相當於在這裡將多執行緒的並行變成了序列。本文重點學習如何使用互斥量進行全域性資料的同步,分為三個部分,第一部分給出**示例,第二部分對**進行講解,第三部分給出執行結果。
一、**示例
該程式使用4個執行緒實現兩個向量的點積運算。
#include "stdafx.h"
#include
#include
#include
typedef struct
dotdata;
#define numthrds 4
#define veclen 100000
dotdata dotstr;
pthread_t callthd[numthrds];
pthread_mutex_t mutexsum;
void *dotprod(void *arg)
dotdata;
定義dotdata結構體,裡面包含4個成員變數,可表示兩個向量,乘積和向量的長度。
#define numthrds 4
#define veclen 100000
dotdata dotstr;
pthread_t callthd[numthrds];
pthread_mutex_t mutexsum;
定義全域性變數和互斥量
int i, start, end, len ;
long offset;
double mysum, *x, *y;
offset = (long)arg;
len = dotstr.veclen;
start = offset*len;
end = start + len;
x = dotstr.a;
y = dotstr.b;
為了點積運算的方便,定義和使用一些區域性變數
mysum = 0;
for (i=start; i
計算點積
pthread_mutex_lock (&mutexsum);給互斥量加鎖,更新全域性變數結構體中的資料,更新完成解鎖,然後退出執行緒dotstr.sum += mysum;
printf("thread %ld did %d to %d: mysum=%f global sum=%f\n",offset,start,end,mysum,dotstr.sum);
pthread_mutex_unlock (&mutexsum);
pthread_exit((void*) 0);
return(null);
a = (double*) malloc (numthrds*veclen*sizeof(double));
b = (double*) malloc (numthrds*veclen*sizeof(double));
for (i=0; i
給兩個向量分配記憶體空間並賦值,然後給全域性變數結構體中資料賦值,最後初始化互斥量
pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, pthread_create_joinable);
for(i=0;i
初始化所要執行的執行緒屬性物件,並將其設定為可結合的,然後根據屬性物件建立4個執行緒,執行 dotprod程式,並傳遞執行緒的id
pthread_attr_destroy(&attr);for(i=0;i
刪除屬性物件,然後結合執行緒,知道每個執行緒都結束才執行下一步程式
printf ("sum = %f \n", dotstr.sum);列印輸出點積結果 ,釋放兩個向量的記憶體,刪除互斥量,退出執行緒。free (a);
free (b);
pthread_mutex_destroy(&mutexsum);
pthread_exit(null);
三、執行結果
互斥量使用例項
4種排序公用乙個陣列 使用互斥量防止訪問衝突 cpp view plain copy include include include using namespace std const intn 12 static intarr 12 handle hmutex 互斥量控制代碼 intdata n ...
執行緒同步 使用互斥量
1.初始化與銷毀互斥量 linux使用pthread mutex t 資料型別表示互斥量,並使用pthread mutex init函式對互斥量進行初始化。include int pthread mutex init pthread mutex t restrict mutex,const pthr...
互斥量的使用《轉》
1 預備知識 臨界區非常適合同一程序中對資料的序列訪問,它的速度很快。然而,也許你想要使某些應用程式與機器中的其它事件或者其它程序取得同步,這時你就要使用一些核心物件來同步執行緒。核心物件包括 程序 執行緒 檔案 檔案變化通知 file change notification 控制台輸入 conso...