线程共享进程的内存空间,打开的文件描述符,全局变量。
当有多个线程同事访问一块内存空间或者一个变量、一个文件描述符,如果不加控制,那么可能会出现意想不到的结果。
原子操作
对于我们的高级语言(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 ;
}

最新文章

  1. MySQL ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO) 的解决办法和原因
  2. 使用ImageMagick的convert命令,实现批量rgb转cmyk
  3. [原创]java WEB学习笔记54:Struts2学习之路---概述,环境的搭建
  4. excel上传和下载
  5. 又爱又恨的BOOTSTRAP
  6. 【python】只执行普通除法:添加 from __future__ import division
  7. J2EE请求和响应—Servlet
  8. Java通过链表实现栈
  9. 关于python中的operator.itemgetter()函数的用法
  10. python二维码生成器
  11. RecyclerView滑动到指定位置,并置顶
  12. 非关系数据库一Memcached
  13. mapstruct与lombok结合使用
  14. elasticsearch 索引备份恢复
  15. Linux&#160;下修改网卡MAC地址
  16. &#39;adb remount&#39;的作用是什么?在什么情况下有用?
  17. NPOI 导出Excel 数据方式
  18. Mysql + Mybatis动态建表
  19. Kotlin语言Web库又添一虎将:Kweb
  20. Scipy

热门文章

  1. Android WelcomeActivity 启动画更换网络图片
  2. C实现通用数据结构--双向链表
  3. Python基础(9)--正则表达式
  4. C标准库&lt;ctype.h&gt;实现
  5. mysql基础操作学习笔记(2)----索引
  6. javascript中五种常见的DOM方法
  7. Web开发须知:URL编码与解码
  8. python lambda表达式简单用法
  9. 迅为顶级四核开发板 Exynos4412开发板,仅售560元
  10. dev/shm time in linux