当前位置: 首页 > wzjs >正文

宁波中小企业网站制作网赢做网站怎么样

宁波中小企业网站制作,网赢做网站怎么样,网站安装不了wordpress,保定哪有做网站的C —— 线程安全 线程安全的基本概念定义共享资源和临界区 三个概念的介绍如何保证线程安全volatile 关键字 线程安全的基本概念 定义 当多个线程同时访问同一个资源(例如变量、数据结构或对象)时,如果程序通过适当的同步机制保证这些访问不…

C++ —— 线程安全

  • 线程安全的基本概念
    • 定义
    • 共享资源和临界区
  • 三个概念的介绍
  • 如何保证线程安全
    • volatile 关键字

线程安全的基本概念

定义

个线程同时访问同一个资源(例如变量、数据结构或对象)时,如果程序通过适当的同步机制保证这些访问不会引起数据损坏不一致性,那么这段代码就是线程安全的。也就是说,无论线程如何调度执行,其结果都与单线程环境下的行为一致

共享资源和临界区

多个线程同时操作的共享资源(如全局变量、静态变量、共享内存等)如果没有保护,就会产生竞争条件(race condition)。通常,访问共享资源代码段称为临界区,需要特殊的机制来保证同一时间只有一个线程能进入。

示例代码:

#include <iostream>
#include <thread>
using namespace std;// 线程任务函数
// 普通函数
void func (int n, const string& s) {for (int i = 1; i <= 5; i++) {cout << "No." << i << ", n = " << n << ", s = " << s << endl;this_thread::sleep_for(chrono::seconds(1));}
}// lambda函数
auto f = [] (int n, const string& s) {for (int i = 1; i <= 5; i++) {cout << "No." << i << ", n = " << n << ", s = " << s << endl;this_thread::sleep_for(chrono::seconds(1));}
};// 仿函数
class mythread_1 {
public:void operator() (int n,const string& s) {for (int i = 1; i <= 5; i++) {cout << "No." << i << ", n = " << n << ", s = " << s << endl;this_thread::sleep_for(chrono::seconds(1));}}
};// 类的静态成员函数
class mythread_2 {
public:static void func (int n, const string& s) {for (int i = 1; i <= 5; i++) {cout << "No." << i << ", n = " << n << ", s = " << s << endl;this_thread::sleep_for(chrono::seconds(1));}}
};// 类的非静态成员函数
class mythread_3 {
public:void func (int n, const string& s) {for (int i = 1; i <= 5; i++) {cout << "No." << i << ", n = " << n << ", s = " << s << endl;this_thread::sleep_for(chrono::seconds(1));}}
};int main () {thread t1(func, 1, "普通函数 t1");thread t2(func, 2, "普通函数 t2");thread t3(f, 3, "lambda函数 t3");thread t4(mythread_1(), 4, "仿函数 t4");thread t5(mythread_2::func, 5, "静态成员函数 t5");mythread_3 mt;thread t6(&mythread_3::func, &mt, 6, "非静态成员函数 t6");cout << "=== start task ===" << endl;for (int i = 1; i <= 5; i++) {cout << "" << endl;this_thread::sleep_for(chrono::seconds(1));}cout << "=== task completed ===" << endl;t1.join();t2.join();t3.join();t4.join();t5.join();t6.join();return 0;
}

编译运行这段代码,你会发现打印出来的信息有些奇怪。这是因为,cout全局对象。在目前这个程序中,所有线程共享cout对象,每个线程都会利用cout向屏幕发送数据。如果同一时间点多个线程使用cout,打印出来的内容肯定会有些奇怪。
再看一段代码:

#include <iostream>
#include <thread>
using namespace std;int res = 0; // 定义全局变量 resvoid func_add () {for (int i = 1; i <= 1000000; i++) {res++;}
}int main () {thread t1(func_add);thread t2(func_add);t1.join();t2.join();cout << "now res = " << res << endl;return 0;
}

我的PC某次运行的结果如下:

now res = 1398091

这段代码使用了两个线程t1t2并行执行func_add 数,因此会并行对全局变量res进行操作。由于res是一个全局变量,两个线程在对其进行修改时可能会发生竞争条件,即两个线程可能会同时读取和修改res,从而导致res的值不准确。不管运行多少次,结果都不会是2000000

三个概念的介绍

  1. 顺序性
    程序按照代码的先后顺序执行
    CPU为了提高程序整体的执行效率,可能会对代码进行优化,按照更高的顺序执行。
  • 顺序性指的是:CPU虽然不能保证完全按照代码的顺序执行,但它会保证最终的结果和按照代码的顺序执行的结果一致
  1. 可见性
    线程操作共享变量时,会将该变量从内存加载到CPU缓存中,修改该变量后,CPU会立即更新缓存,但不一定会立即将它写入内存。若此时有其他线程访问该变量,从内存中读到的是旧数据,而非第一个线程操作后的数据。
  • 可见性指的是:当多线程并发访问共享变量时,一个线程对共享变量的修改,其它线程能够立即看到。
  1. 原子性
    CPU执行指令的顺序:读取指令、从内存读取数据、执行指令、把数据写回内存。
  • 原子性指的是:一个操作(有可能包含有多个步骤)要么全部执行(生效),要么全部都不执行(都不生效)。

如何保证线程安全

  • volatile关键字
  • 原子操作(原子类型)
  • 线程同步(

volatile 关键字

volatile关键字包含两方面

  1. 保证内存变量的可见性
  2. 禁止代码优化(重排序)

volatile关键字修饰res变量(其他代码不变):

volatile int res = 0;

修改后编译运行程序,并不能解决问题。因为,volatile关键字仅解决了可见性问题,并不能完全解决线程安全问题。

其他两个保证线程安全的方法未完待续

感谢浏览


文章转载自:

http://om9RHse8.nqnqz.cn
http://Wesqatm6.nqnqz.cn
http://FyQqBjVY.nqnqz.cn
http://EmLBHDV4.nqnqz.cn
http://BPwWazix.nqnqz.cn
http://zN4bjcvC.nqnqz.cn
http://5I5SxJeP.nqnqz.cn
http://nx7WlePi.nqnqz.cn
http://fgmnuGop.nqnqz.cn
http://MWVglbsb.nqnqz.cn
http://4RRqJfkh.nqnqz.cn
http://3L2wO69D.nqnqz.cn
http://i2RTpJhq.nqnqz.cn
http://YRKFfTQ7.nqnqz.cn
http://4TXPvp0t.nqnqz.cn
http://139BZSyO.nqnqz.cn
http://iyYeYEEs.nqnqz.cn
http://71H2NNJl.nqnqz.cn
http://Rb1uSvmw.nqnqz.cn
http://6ZdZaCVV.nqnqz.cn
http://7WC19nTM.nqnqz.cn
http://N3fO5DpO.nqnqz.cn
http://MjBebEvS.nqnqz.cn
http://BACgHzF4.nqnqz.cn
http://70uDIRiI.nqnqz.cn
http://yjduT0FX.nqnqz.cn
http://zRHJooXu.nqnqz.cn
http://kCo8UqiH.nqnqz.cn
http://b0ymbEDJ.nqnqz.cn
http://GpCQow7I.nqnqz.cn
http://www.dtcms.com/wzjs/764908.html

相关文章:

  • 网站建设服务规划与措施网站建设的方案图片
  • 自适应网站模板建站wordpress 资源站主题
  • 濮阳做公司网站龙华网站建设哪家公司好
  • 青岛市工程建设信息网站教育网站建站需求
  • 上海优秀网站设计wordpress主机 好吗
  • 做网站怎么租个空间网络营销课程总结范文
  • 苏州手机网站开发公司教务系统管理系统入口
  • 网站制作案例怎么样怎样在设计网站做图赚钱吗
  • 建设网站网站威海 医院网站建设
  • 网站建设人员性格网络营销专业就业
  • 网站续费 多久wordpress主题video
  • 连云港网站关键词优化服务网站建设合同服务内容
  • vps网站解析域名加速百度对网站文章的收录
  • 免费发布信息网站怎么让网站绑定域名
  • 健康管理公司网站建设罗岗网站建设哪家好
  • 美术馆网站建设概述襄阳seo顾问
  • 建设银行黑龙江省分行官方网站建html5响应式网站的工具
  • 如何弄死一个网站灌南县建设局网站
  • 做网站的那家公司好推广普通话手抄报文字
  • 石家庄网站制作公司哪家好北欧做的比较好的网站
  • 做会员系统的网站用什么cms好wordpress scripts gzip
  • 网站维护开发合同孝义网站开发公司
  • 医院网站建设模板下载百度新闻app
  • 网站优化方案官方网站建设与维护好处
  • 网站 网站 建设wordpress接入安卓
  • 织梦可以做婚纱影楼网站吗网站页面设计报价表
  • 网站模板整站资源大学生网页设计作业
  • 做响应式的网站免费网络推广网址
  • 品牌大气的网站设计代码怎么生成网站
  • 专业的高端网站设计公司关于网站开发的一些论文