多线程例子
来源:互联网 发布:win10没有网络协议 编辑:程序博客网 时间:2024/05/20 19:48
互斥锁
正如上面所说的,如果两个线程同时对一块内存进行读写或者对向同一个文件写数据,那么结果是难以设想的。正因为如此,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
例如int *a int *b 分别指向两块内存,上面的值分别初始化为(200, 100) 线程A执行这样的一个操作:将*a的值减少50,*b的值增加50.
线程B执行:打印出(a 跟 b 指向的内存的值的和)。
如果串行运行:A: *a -= 50; *b += 50; B: printf("%d\n", *a + *b);
如果并发执行,则有可能会出现一下调度:*a -= 50; printf("%d\n", *a + *b); *b += 50;
因此我们可以引入互斥量,在对共享数据读写时进行锁操作,实现对内存的访问以互斥的形式进行。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int
a = 200;
int
b = 100;
pthread_mutex_t lock;
void
* ThreadA(
void
* arg)
{
pthread_mutex_lock(&lock);
//锁
a -= 50;
sleep(5);
//执行到一半 使用sleep 放弃cpu调度
b += 50;
pthread_mutex_unlock(&lock);
}
void
* ThreadB(
void
* arg)
{
sleep(1);
//放弃CPU调度 目的先让A线程运行。
pthread_mutex_lock(&lock);
printf
(
"%d\n"
, a + b);
pthread_mutex_unlock(&lock);
}
int
main()
{
pthread_t tida, tidb;
pthread_mutex_init(&lock, NULL);
pthread_create(&tida, NULL, ThreadA, NULL);
pthread_create(&tidb, NULL, ThreadB, NULL);
pthread_join(tida, NULL);
pthread_join(tidb, NULL);
return
1;
}
以上输出为300 去掉锁操作 输出为250。
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子
- 多线程例子 Runnable 例子。
- 多线程例子双线性例子
- vb.net多线程例子
- 开始我的博客之旅
- 开始学习Sencha Touch
- Kmp算法的两种写法
- 我是个宅男,天天就想着美女---Android app>>Girl Style看过来
- java实现MD5数据加密
- 多线程例子
- 游戏网络编程非常好的资料
- 逆波兰表达式学习日记(1)
- FreeMind 画的TCPIP四层OSI七层协议
- DWR配置
- jquery 实现原理七:DOM遍历-tranversing
- 黑马javaSE内部编程题10道--第一道源码
- 简单包传输协议
- MythTV开源软件