thread相关——互斥锁
来源:互联网 发布:淘宝客服介入会怎么样 编辑:程序博客网 时间:2024/05/22 06:22
互斥锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源。可以保证以下三点:
原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或pthread函数库)保证了如果一个线程
锁定了一个互斥量,没有其他线程在同一时间可以成功锁定这个互斥量。
唯一性:如果一个线程锁定了一个互斥量,在它解除锁定之前,没有其他线程可以锁定这个互斥量。
非繁忙等待:如果一个线程已经锁定了一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将
被挂起(不占用任何cpu资源),直到第一个线程解除对这个互斥量的锁定为止,第二个线程则被唤
醒并继续执行,同时锁定这个互斥量。
从以上三点,我们看出可以用互斥量来保证对变量(关键的代码段)的排他性访问。
from http://blog.chinaunix.net/uid-21411227-id-1826888.html
从网上找的代码,但是自己还不是很能理解。所以根据这个代码进行研究分析。。。
下面的代码 from http://blog.csdn.net/hitwengqi/article/details/8015646
#include <stdio.h>#include <Windows.h>#include<iostream>#include <pthread.h>#pragma comment(lib, "pthreadVC2.lib") //必须加上这句using namespace std;#define NUM_THREADS 5 int sum = 0;//定义个全局变量,让所有线程进行访问,这样就会出现同时写的情况,势必会需要锁机制; pthread_mutex_t sum_mutex; void* say_hello(void* args) { cout << "hello in thread " << *((int *)args) << endl; pthread_mutex_lock (&sum_mutex);//修改sum就先加锁,锁被占用就阻塞,直到拿到锁再修改sum; cout << "before sum is " << sum << " in thread " << *((int *)args) << endl; sum += *((int *)args); cout << "after sum is " << sum << " in thread " << *((int *)args) << endl; pthread_mutex_unlock (&sum_mutex);//完事后解锁,释放给其他线程使用; pthread_exit(0);//退出随便扔个状态码 return NULL;} int main() { pthread_t tids[NUM_THREADS]; int indexes[NUM_THREADS]; //下三句是设置线程参数,但是没明白有什么必要性。。。。 pthread_attr_t attr; //线程属性结构体,创建线程时加入的参数 pthread_attr_init(&attr); //初始化 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); //是设置你想要指定线程属性参数,这个参数表明这个线程是可以join连接的,join功能表示主程序可以等线程结束后再去做某事,实现了主程序和线程同步功能 pthread_mutex_init (&sum_mutex, NULL);//这句是对锁进行初始化,必须的; for(int i = 0; i < NUM_THREADS; ++i) { indexes[i] = i; int ret = pthread_create( &tids[i], &attr, say_hello, (void *)&(indexes[i]) );//5个进程你们去修改sum吧哈哈; if (ret != 0) { cout << "pthread_create error: error_code=" << ret << endl; } } pthread_attr_destroy(&attr);//删除参数变量 void *status; for (int i = 0; i < NUM_THREADS; ++i) { int ret = pthread_join(tids[i], &status); if (ret != 0) { cout << "pthread_join error: error_code=" << ret << endl; } } cout << "finally sum is " << sum << endl; pthread_mutex_destroy(&sum_mutex);//注销锁,可以看出使用pthread内置变量神马的都对应了销毁函数,估计是内存泄露相关的吧; system("pause"); return 0;}
运行结果如下:
hello in thread hello in thread 1hello in thread 3hello in thread 2hello in thread 40before sum is 0 in thread 4after sum is 4 in thread 4before sum is 4 in thread 2after sum is 6 in thread 2before sum is 6 in thread 1after sum is 7 in thread 1before sum is 7 in thread 3after sum is 10 in thread 3before sum is 10 in thread 0after sum is 10 in thread 0finally sum is 10请按任意键继续. . .//多线程的顺序是混乱的,混乱就是正常;只要sum访问及修改是正常的,就达到多线程的目的了,运行顺序不能作为参照;
阅读全文
0 0
- thread相关——互斥锁
- thread相关——基础1
- thread相关——读写锁
- thread相关
- POSIX Thread相关
- Linux Thread相关
- C# Thread 相关 笔记
- Thread相关属性
- Thread相关基础
- SDL Thread 相关API
- Thread相关方法介绍
- Thread类相关问题
- Thread系列——Thread.Sleep(0)
- apue thread posix thread posix线程相关
- 线程——Thread
- Java——Thread!!!
- 线程——Thread
- 线程——Thread
- sqlserver2008的安装
- muduo网络库学习(二)对套接字和监听事件的封装Channel
- angularJs 正 到 排序
- rest服务理解以及restful api
- 基于java的设计模式的代理模式
- thread相关——互斥锁
- 论文阅读:《Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields》CVPR 2017
- Mob手机验证码android studio实现
- Linux Unit11--系统中的文件传输
- Construct2从入门到不放弃
- logback日志框架的知识
- 系统开发排行榜
- SQLite查询计划器和优化(译)
- 2017.10.23 卡牌游戏 失败总结