一、(LINUX 线程同步) 引入
发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,原创水平有限有误请指出线程相比进程有着先天的数据共享的优势,如下图,线程共享了进程除栈区以外的所有内存区域如下图所示:但是这种共享有时候也会带来问题,简单的考虑如下C++代码:点击(此处)折叠或打开{
千家信息网最后更新 2025年02月07日一、(LINUX 线程同步) 引入原创水平有限有误请指出
线程相比进程有着先天的数据共享的优势,如下图,线程共享了进程除栈区以外的所有内存区域如下图所示:
![](https://www.aqdb.cn/uploadfile/b5/931c0c8a.jpg)
但是这种共享有时候也会带来问题,简单的考虑如下C++代码:
就是临界区代码
后面将对他们进行描述,这里我们简单实用静态互斥锁进行解决这个问题。
临界区的选择应该尽量小,避免对多线程的并发性产生较大的性能影响
具体代码如下:
注意:一个简单类型的i++也不一定是一个原子操作,所以在涉及到并发修改共享变量的时候一定要使用
线程同步手段。
作者微信:
![](https://www.aqdb.cn/uploadfile/81/9cee362e.jpg)
线程相比进程有着先天的数据共享的优势,如下图,线程共享了进程除栈区以外的所有内存区域如下图所示:
![](https://www.aqdb.cn/uploadfile/b5/931c0c8a.jpg)
但是这种共享有时候也会带来问题,简单的考虑如下C++代码:
点击(此处)折叠或打开
- {
- int b = 0;
- b = a;
- a = b+1;
- return *this;
- }
就是临界区代码
后面将对他们进行描述,这里我们简单实用静态互斥锁进行解决这个问题。
点击(此处)折叠或打开
- //原子操作 加锁
- pthread_mutex_lock(&mtx);
- ++test;
- pthread_mutex_unlock(&mtx);
- //原子操作 解锁
- cout<<pthread_self() <<":";
- test.prit()
临界区的选择应该尽量小,避免对多线程的并发性产生较大的性能影响
具体代码如下:
点击(此处)折叠或打开
- /*************************************************************************
- > File Name: error.cpp
- > Author: gaopeng QQ:22389860 all right reserved
- > Mail: gaopp_200217@163.com
- > Created Time: Mon 15 May 2017 12:01:33 AM CST
- ************************************************************************/
- #include<iostream>
- #include <pthread.h>
- #include <string.h>
- #define MAXOUT 1000000
- using namespace std;
- static pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;
- class testc
- {
- private:
- int a;
- public:
- testc()
- {
- a = 1;
- }
- testc& operator++()
- {
- int b = 0;
- b = a;
- a = b+1;
- return *this;
- }
- void prit()
- {
- cout<<a<<endl;
- }
- };
- testc test = test;
- void* testp(void* arg)
- {
- int i = MAXOUT;
- while(i--)
- {
- //原子操作 加锁
- pthread_mutex_lock(&mtx);
- ++test;
- pthread_mutex_unlock(&mtx);
- //原子操作 解锁
- cout<<pthread_self() <<":";
- test.prit();
- }
- }
- int main(void)
- {
- pthread_t tid[3];
- int er;
- int i = 0;
- while(i<3)
- {
- if ((er = pthread_create(tid+i,NULL,testp,NULL) )!=0 )
- {
- strerror(er);
- return -1;
- }
- i++;
- }
- i = 0;
- while(i<3)
- {
- pthread_join(*(tid+i),NULL);
- i++;
- }
- cout<<"last numer: ";
- test.prit();
- }
注意:一个简单类型的i++也不一定是一个原子操作,所以在涉及到并发修改共享变量的时候一定要使用
线程同步手段。
作者微信:
![](https://www.aqdb.cn/uploadfile/81/9cee362e.jpg)
原子
线程
代码
就是
进程
问题
同步
实用
较大
优势
作者
先天
内存
区域
变量
实际
实际上
将对
性能
手段
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
校园网络安全知识题库及答案
服务器硬盘坏了如何更换
大一进入网络安全工作室
暴雨骄阳网络技术有限公司
vba删除数据库数据
将用户信息添加到数据库
数据库获取信息失败
脚本语言向数据库写数据
计算机网络技术实习内容
杭州软件开发技术费用
长春软件开发工程师
雕版印刷技术数据库
软件开发测试好吗
高中数据库应用软件
社科全文数据库
python与金融软件开发
城市天际线上海服务器
汕头微商软件开发收费
地税四加强网络安全
服务器储存数据赚钱
太原无线网络技术
华东师范大学数据库期末试卷
使用外网ip访问服务器
开发钉钉应用部署云服务器
安卓设备检测软件开发
长春软件开发工程师
厦门软件开发公司怎么选
软件开发所对应的职业0
我军已经颁布网络安全规定方法
杭州边锋网络技术 诈骗