Linux pthread_mutex演示程序C++語言: Linux pthread_mutex演示程序
Linux 下pthread 中使用mutex 進行互斥的程序和結(jié)果
#include "stdio.h" #include "string.h" #include "stdlib.h" #include "pthread.h" #define THREAD_NUMBER 2 int sum = 0; void* fun(void* arg) { int t = (*(int*)arg); int i; for (i = t ;i < 10000; i += 2) sum = sum + i; return NULL; } int main(){ pthread_t T[THREAD_NUMBER]; int arg[THREAD_NUMBER]; int ret,i; void* join_result; for (i =0 ;i < THREAD_NUMBER; ++ i){ arg[i] = i; ret = pthread_create(&T[i],NULL,fun,(void*)&arg[i]); if (ret){ printf("Thread %d crreate failure!\n",i); exit(EXIT_FAILURE); } } for (i = 0 ;i < THREAD_NUMBER; ++ i){ ret = pthread_join(T[i],&join_result); if (ret) { printf("Thread %d join failure!\n",i); exit(EXIT_FAILURE); } } printf("sum = %d\n",sum); return 0; } 上面的程序是沒有進行互斥的 nomutex.c 該程序用于求 1...9999的和,可以gcc -l pthreacd -o test nomutex.c編譯該程序, 并且可以實驗運行結(jié)果基本上都是不對的,由于該程序沒有應(yīng)用互斥操作,所以可想而知為什么結(jié)果是不對的。 下面的程序就在上面程序的基礎(chǔ)上加上了求和時的互斥操作,所以運行結(jié)果都是對的。 #include "stdio.h" #include "string.h" #include "stdlib.h" #include "pthread.h" #define THREAD_NUMBER 2 int sum = 0; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* fun(void* arg) { int t = (*(int*)arg); int i; for (i = t ;i < 10000; i += 2) { pthread_mutex_lock(&mutex); sum = sum + i; pthread_mutex_unlock(&mutex); } return NULL; } int main(){ pthread_t T[THREAD_NUMBER]; int arg[THREAD_NUMBER]; int ret,i; void* join_result; for (i =0 ;i < THREAD_NUMBER; ++ i){ arg[i] = i; ret = pthread_create(&T[i],NULL,fun,(void*)&arg[i]); if (ret){ printf("Thread %d crreate failure!\n",i); exit(EXIT_FAILURE); } } for (i = 0 ;i < THREAD_NUMBER; ++ i){ ret = pthread_join(T[i],&join_result); if (ret) { printf("Thread %d join failure!\n",i); exit(EXIT_FAILURE); } } printf("sum = %d\n",sum); return 0; } 用這兩個小程序,只是想演示一下linux下pthread 的互斥操作??梢钥吹?,在多線程環(huán)境中,為了保證共享變量的值的正確性, 互斥是非常重要的。
|
|