Linux 进程与线程四(加锁--解锁)
线程共享进程的内存空间,打开的文件描述符,全局变量。
当有多个线程同事访问一块内存空间或者一个变量、一个文件描述符,如果不加控制,那么可能会出现意想不到的结果。
原子操作
对于我们的高级语言(C语言,java,c#),普通的一句代码一般都是由多条汇编语句组成,计算机CPU每次所执行的都是一条汇编指令
,一条汇编指令是无法再次拆分的,所以计算机CPU同一时间只能执行一条汇编指令就是一个原子操作。
互斥(mutex)是相互排斥的意思,它是一种锁或者信号灯。
互斥用来保护多个线程共享的数据和结构不会被同事修改,一个互斥锁只能有两个状态
--locked 加锁
--unlocked 解锁
加锁后互斥不让其他线程访问。
任何时刻只能有一个线程来掌握某个互斥上锁。
锁操作是一个原子操作
一个线程如果试图在一个已经加锁的互斥上再加锁,这个线程会被挂起,,直到加锁的线程释放掉互斥锁为止。
强调:加锁解锁针对的是pthread_mutex_t类型的变量,只要有一个地方加锁,哪怕在别的线程中有加锁代码,那个线程也会被挂起,
只有当pthread_mutex_t类型的变量解锁后,其他的线程才可以继续对pthread_mutex_t类型的变量加锁。
注意:互斥情况下,如果将某个正在加锁占用资源的进程用pthread_cancel函数取消掉,可能产生死锁。
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
PTHREAD_MUTEX_INITIALIZER是初始化一个快速锁的宏定义。
pthread_mutex_lock用户给mutex加锁。
pthread_mutex_unlock用于给mutex解锁
//线程加锁--pthread_mutex_lock
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <unistd.h>
#include <errno.h>
#include <pthread.h> //定义一个全局的互斥变量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int count = ; void * MyFunc(void * arg)
{
if (arg == NULL)
{
printf("param is not allow NULL!\n");
return NULL;
}
//加锁--所有线程都能访问的全局变量加锁
pthread_mutex_lock(&mutex);
int * pnumx = (int *) arg;
int i = ;
while (i < )
{
printf("thread%d count=%d\n", *pnumx, count++);
sleep();
i++;
}
//解锁
pthread_mutex_unlock(&mutex);
return NULL;
} void * MyFunc2(void * arg)
{
if (arg == NULL)
{
printf("param is not allow NULL!\n");
return NULL;
}
//这个锁和myfunc中的锁是同一个锁,myfunc被锁,这里也会被锁
pthread_mutex_lock(&mutex);
int * pnumx = (int *) arg;
int i = ;
while (i < )
{
printf("thread%d count=%d\n", *pnumx, count++);
sleep();
i++;
}
//解锁
pthread_mutex_unlock(&mutex);
return NULL;
} int main(int arg, char * args[])
{
pthread_t thr1, thr2;
pthread_attr_t attr;
pthread_attr_init(&attr);
//设置进程为可分离状态
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
int a = , b = ;
//创建线程
if (pthread_create(&thr1, &attr, MyFunc, &a) != )
{
printf("create thread is failed ! error message :%s\n",
strerror(errno));
return -;
}
//释放进程属性对象
pthread_attr_destroy(&attr);
if (pthread_create(&thr2, NULL, MyFunc, &b) != )
{
printf("create thread is failed ! error message :%s\n",
strerror(errno));
return -;
}
pthread_join(thr2, NULL);
printf("main end\n");
return ;
}
Linux 进程与线程四(加锁--解锁)的更多相关文章
- Linux进程或线程绑定到CPU
Linux进程或线程绑定到CPU 为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU,这样可以减少调度的开销和保护关键进程或线程. 进程绑定到CPU Linux提供一个接口,可以将进程 ...
- Linux进程和线程的比較
进程与线程 參考:http://www.cnblogs.com/blueclue/archive/2010/07/16/1778855.html 首先比較Linux进程和线程的创建的差别,以此展开: ...
- Linux 进程、线程运行在指定CPU核上
/******************************************************************************** * Linux 进程.线程运行在指定 ...
- Linux进程与线程的区别
进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念, ...
- 操作系统:Linux进程与线程
这里是一部分内容,还会做修改. 一:目的及内容 学习fork(),exec,pthread库函数的使用,阅读源码,分析fork,exec,pthread_create函数的机理 代码实现: 进程A创建 ...
- linux进程、线程与cpu的亲和性(affinity)
参考:http://www.cnblogs.com/wenqiang/p/6049978.html 最近的工作中对性能的要求比较高,下面简单做一下总结: 一.什么是cpu亲和性(affinity) C ...
- linux进程与线程的区别【转】
知乎上总结: "linux使用的1:1的线程模型,在内核中是不区分线程和进程的,都是可运行的任务而已.fork调用clone(最少的共享),pthread_create也是调用clone(最 ...
- Linux进程和线程
一.进程产生的方式 1.描述进程的ID号通常叫做PID,即进程ID,PID的变量类型为pid_t. 2.getpid(void)返回当前进程的ID号,getppid(void)返回当前进程的父进程的I ...
- Linux -- 进程或线程独占CPU
如果想让特定进程或线程独占某一或某些CPU,我们需要做三件事. 一,隔离CPU,避免其它线程run在被隔离的CPU上. 二,绑定所有的interrupts到非隔离的CPU上,避免被隔离的CPU收到in ...
随机推荐
- 【读书笔记】iOS-KVC
一,KVC即键/值编码. 二,KVC的基本调用包括-valueForKey:和-setValue:forKey:. 三,对于KVC,Cocoa自动放入和取出标量值.也就是说,当使用setValueFo ...
- IOS UICollectionView基础+UICollectionViewFlowLayout基础
UICollectionView在众多控件中也算是比较常用的了,像淘宝在浏览宝贝时采用的就是UICollectionView,对于UICollectionView->UICollectionVi ...
- 关于 xib 的使用
前两天写百度地图的时候要添加 一个标注的泡泡view 但有些复杂所以想用xib 拖拽出一个View ,拖拽出来之后发现添加不到Controller中 ,郁闷!! 终于找到了方法: //先获取NIb ...
- 二维码扫描利用ZBar实现
上次是根据系统的属性自己封装的一个二维码扫描,这次给大家介绍一下基于ZBar集成的类似于QQ二维码扫描界面的二维码扫描的效果. ...
- Oracle instr函数与SqlServer charindex的区别
INSTR(C1,C2[,I[,J]]) [功能]在一个字符串中搜索指定的字符,返回发现指定的字符的位置; [说明]多字节符(汉字.全角符等),按1个字符计算 [参数] C1 被搜索的字符串 ...
- 图解 SQL 各种连接查询之间的区别
转载自:http://blog.csdn.net/xuanjiewu/article/details/50636465 对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有 ...
- 《SQL Server企业级平台管理实践》读书笔记——几个系统库的备份与恢复
master数据库 master作为数据库的主要数据库,记录着SQL Server系统的所有系统级信息,例如登录用户.系统配置设置.端点和凭证以及访问其他数据服务器所需要的信息.master数据库还记 ...
- Android 开发之 Android 开发的起步
前言 Android 开发的起步 我们可以先来看看百科上面怎么说? 百度百科上 Android的介绍 一.Windows环境下在线搭建Android环境. 1. 下载 Android开发工具. JD ...
- 计算几何--判断两条线段相交--poj 2653
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8862 Accepted: 3262 De ...
- Android中Spanner获取选中内容和选中位置,根据位置选择对象
作为一名菜鸟,关于spanner获取选中的内容文字代码,网上后很多 但是根据给出的位置来自动选择对象,这个代码一直没找到 后来找人问了问,才知道就一句话的事,特意在这里记录下 array.xml X ...