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

网站开发主管岗位说明杭州seook优屏网络

网站开发主管岗位说明,杭州seook优屏网络,小学网站建设设计方案,网站备案 影响原子操作,顾名思义,该操作不可分割。多线程环境也能保证读写数据不错乱。百度搜索了下,其核心概念如下: 1、不可分割性。原子操作是指一系列不可被CPU上下文交换的机器指令,操作要么完全执行,要么完全不执…

原子操作,顾名思义,该操作不可分割。多线程环境也能保证读写数据不错乱。百度搜索了下,其核心概念如下:

1、不可分割性。原子操作是指一系列不可被CPU上下文交换的机器指令,操作要么完全执行,要么完全不执行,其他线程无法观察到中间状态‌。

2、可见性和顺序性。原子操作确保对变量的修改在所有线程中立即可见,并可通过内存顺序(如memory_order_relaxedmemory_order_seq_cst)控制操作的全局顺序一致性‌。

为了验证上面结论,测试下。 下面是开启10个线程执行同一个函数,将一个变量增加10000次,最终期望该变量值为100000,代码如下:

#include <iostream>
#include "listNode.h"
#include "solution.h"
#include <algorithm>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include "solution3.h"
#include "dataDefine.h"
#include "uthash.h"
#include "IntArrayList.h"
#include <string.h>
#include <thread>
#include <atomic>static std::atomic<int> count2{0};  // 原子整型
// 或这样写:
//static std::atomic<int> count2(0);void task2(int id) {for (auto i = 0; i < 10000; i++) {count2.fetch_add(1); // 值自增1}cout << "id:" << id << ", threadID:" << std::this_thread::get_id() << "  finish" << endl;
}void testTread2() {vector<thread> threads;for (auto i = 0; i < 10; i++) {thread t(task2, i); // i是task2函数的参数threads.emplace_back(std::move(t)); // 线程不可拷贝,只能移动。不能直接传t, 或者直接这样:threads.emplace_back(task2, i);}for (auto& t : threads) {//cout << "thread id: " << t.get_id() << " invoke join in" << endl;t.join(); // 当前线程(即主线程)等待这个线程执行完毕。}cout << "count2 value: " << count2 << endl;
}int main() {testTread2();
}

测试结果:

ok! 和预期结果一致。

再测试下非原子操作。下面操作是开启10个线程执行同一个函数,将一个变量增加10000次,最终期望该变量值为100000, 代码示例:

#include <iostream>
#include "listNode.h"
#include "solution.h"
#include <algorithm>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include "solution3.h"
#include "dataDefine.h"
#include "uthash.h"
#include "IntArrayList.h"
#include <string.h>
#include <thread>
#include <atomic>static auto count1 = 0;
void task1(int id) {for (auto i = 0; i < 10000; i++) {count1++;}cout << "id:" << id << ", threadID:" << std::this_thread::get_id() << "  finish" << endl;
}void testTread1() {vector<thread> threads;for (auto i = 0; i < 20; i++) {threads.emplace_back(task1, i);  // i是task1函数的参数// 或者这样构造一个线程//thread t(task1, i);}for (auto& t : threads) {//cout << "thread id: " << t.get_id() << " invoke join in" << endl;t.join(); // 当前线程(即主线程)等待这个线程执行完毕。}cout << "count1 value: " << count1 << endl;
}int main() {testTread1();
}

测试打印结果:

打印 count1 value:92243, 和期望值不一致,每次执行结果都是不确定的值。而且日志也打印的乱糟糟。

结论:非原子操作,以上示例,多线程调用同一个函数,没有对线程进行同步, 导致读写数据错乱,比如线程1读取该变量值为10, 可能同时线程2也读取到该变量值为10,然后都加1,结果变量值变为11被写回。所以最终结果会小于预期值。

http://www.dtcms.com/wzjs/141491.html

相关文章:

  • 网站建设推广浩森宇特外贸seo软件
  • 网站备案需要营业执照吗网站更新seo
  • 北京网站制作推广培训加盟
  • 个性化网站建设报价2023年适合小学生的新闻
  • 局域网建设简单的影视网站2022年近期重大新闻事件
  • 哪个网站看电视剧最全还免费个人对网络营销的看法
  • 网站建设报价网站建设报价单百度权重是怎么来的
  • 高端网站建设套餐重庆网站制作公司哪家好
  • 网站最合适的字体大小搜索引擎seo
  • 商业空间设计理念seo营销外包
  • java能做网站开发么app推广引流方法
  • wordpress修改幻灯片成都谷歌seo
  • 建设网站专业预防电信网络诈骗
  • 门户网站跳出率seo企业优化顾问
  • 临汾网站建设 吕梁网站建设网络推广公司主要做什么
  • 苗木门户网站模板论坛seo教程
  • 捷信做单网站南京百度seo公司
  • 网站不足搜索引擎优化网页
  • 北京 做网站大片ppt免费下载安装
  • win7做本地网站今日热点
  • 外挂网站建设在线培训平台有哪些
  • 自助游戏充值网站怎么做全国疫情最新情况
  • 郑州企业网站优化淮北seo
  • 网站建设备案流程线上推广有哪些平台效果好
  • 企业官方网站应该怎么样建设网站怎么优化推荐
  • 专业团队海报百度怎么做关键词优化
  • 政府网站建设预算10万徐州seo公司
  • 网站没有备案可以做百度推广吗客户引流推广方案
  • 网站建设制作设计2022年最新新闻播报稿件
  • 沈阳哪里有教做网站的搜索广告和信息流广告区别