线程同步1 ------ 互斥锁 ------一个更加典型的例子
2017-12-04 11:19
246 查看
上一篇博文里,举了一个简单的应用共享锁的例子。本篇博文将介绍一个稍微更加复杂点的例子。
有一个全局变量数组out,包含100个元素,所有元素初始化为0。然后开启2个子线程同时对数组out进行赋值操作。在此过程,应该启用共享锁对赋值代码进行同步。具体代码如下:
运行结果如下:
从运行情况看,2个线程交替运行,将100个数组元素全部赋成了新值。
有一个全局变量数组out,包含100个元素,所有元素初始化为0。然后开启2个子线程同时对数组out进行赋值操作。在此过程,应该启用共享锁对赋值代码进行同步。具体代码如下:
#include <stdio.h> #include <pthread.h> pthread_mutex_t number_mutex; //out数组是全局变量,100个元素全部初始化为0,2个线程共同为out数组赋值 int out[100]; //线程1 void thread1() { int i; while(1){ printf("Thread 1 operated.\n"); pthread_mutex_lock(&number_mutex); for(i=0;i<100;i++){ if(out[i]==0){ //尚未赋值的元素,则将其赋值 out[i]=1111; break; } } //如果最后一个元素都已经被赋值了,则解锁,之后退出本线程 if(out[99]!=0) { pthread_mutex_unlock(&number_mutex); return; } pthread_mutex_unlock(&number_mutex); } } //线程2 void thread2() { int i; while(1){ printf("Thread 2 operated.\n"); pthread_mutex_lock(&number_mutex); for(i=0;i<100;i++){ if(out[i]==0){ out[i]=2222; break; } } if(out[99]!=0) { pthread_mutex_unlock(&number_mutex); return; } pthread_mutex_unlock(&number_mutex); } } main() { //对out数组的100个元素赋初值 int i; for(i=0;i<100;i++){ out[i]=0; } pthread_t thid1,thid2; printf("This is Main Thread.\n"); pthread_mutex_init(&number_mutex,NULL); pthread_create(&thid1,NULL,thread1,NULL); pthread_create(&thid2,NULL,thread2,NULL); int status1,status2; pthread_join(thid1,(void*)&status1); pthread_join(thid2,(void*)&status2); pthread_mutex_destroy(&number_mutex); //输出数组100个元素的新值 for(i=0;i<100;i++){ printf("%d, ",out[i]); } printf("\nMain Thread exit\n"); }
运行结果如下:
从运行情况看,2个线程交替运行,将100个数组元素全部赋成了新值。
相关文章推荐
- tomcat、servlet、jsp的一个典型例子
- Delphi多线程的OnTerminate属性(附加一个关于临界区线程同步的例子)
- 一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥。
- C#中的一个线程同步的例子
- 一个典型的双缓冲的例子
- 用递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C
- 一个datagrid中嵌入checkBox典型的例子
- 一个典型的Hibernate实体操作例子
- 一个更加明显的rownum的例子
- Linux多线程编程(不限Linux)——本文一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥。
- 本文一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥
- 一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥。
- 线程同步的小例子(两个线程对一个List进行写操作)
- 一个典型的例子理解JavaScript作用域以及变量提升
- unix 线程同步之 条件变量 及 互斥锁 测试例子
- 从一个例子看看一个典型的混乱是如何形成
- 一个黑洞的典型例子
- 经常会遇见java.lang.NullPointerExcetion 的错误,典型的一个错误例子,供大家参考
- DataTemplate——数据模板的一个典型例子
- Ajax的一个典型引用的例子