Linux pthread_mutex演示程序C++语言: Linux pthread_mutex演示程序
Linux 下pthread 中使用mutex 进行互斥的程序和结果
#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编译该程序, 并且可以实验运行结果基本上都是不对的,由于该程序没有应用互斥操作,所以可想而知为什么结果是不对的。 下面的程序就在上面程序的基础上加上了求和时的互斥操作,所以运行结果都是对的。 #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 的互斥操作。可以看到,在多线程环境中,为了保证共享变量的值的正确性, 互斥是非常重要的。
|
|