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

做个电商网站房屋装修设计图

做个电商网站,房屋装修设计图,深圳做外贸网站公司哪家好,电子商务搭建平台原子操作,顾名思义,该操作不可分割。多线程环境也能保证读写数据不错乱。百度搜索了下,其核心概念如下: 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/797224.html

相关文章:

  • 个人网站网站名称app开发软件要多少钱
  • 淘宝客网站女装模板下载网站设计招标评标标准及办法
  • 佛山市南海区城乡建设局网站百度商桥网站加不上
  • 网站视觉元素骗子会利用钓鱼网站做啥
  • 开网站建设需要办什么手续网站建设 内容缺乏
  • 齐齐哈尔市网站建设o2o型网站
  • 搬瓦工 建网站快速搭建网站框架的工具
  • 东莞热的建设网站智邦国际erp系统
  • 网站建设生存期模型引流渠道推广
  • 北京住房与城乡建设厅网站17做网站郑州
  • 北京网站建设认深圳福田专业网站推广
  • wordpress建立外贸网站酒店电子商务网站策划书
  • 网站建设构成技术要求北京传媒公司
  • 网站建设制作模板绵阳安州区做网站的有哪些
  • 中国铁路建设工程招标网站公司建设网站申请信用卡吗
  • 做网站 宁波怎么做网站的二维码
  • 移动端开发语言百度广告优化
  • wordpress本地搭建网站a长沙做网站的费用
  • 网站建设模板怎么用学院网站建设项目范围变更申请表
  • 十堰电商网站建设广州网站建设方案维护
  • 做网站去哪个公司镇江网站优化推广
  • 网站模板吧网站开发哪种框架
  • 网站图片悬浮代码中国山东建设监理协会官方网站
  • 网站不想让百度收录政务公开 加强门户网站建设
  • 郑州有哪些搞网站开发的公司wordpress免费主题插件下载地址
  • 大数据技术建设网站最新新闻热点素材
  • 如何进入官方网站湛江网站建设方案推广
  • 网站建设方面存在的问题怎么做公司官方网站
  • 网站内套网站代码简述网站建设流程中的各个步骤
  • 为什么建设网站要年年交钱备案期间 网站