(五)创建和等待多个线程、数据共享问题分析(有读有写)

2024-06-19 09:08

本文主要是介绍(五)创建和等待多个线程、数据共享问题分析(有读有写),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、创建和等待多个线程

#include <thread>
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;void myprint(const int & i) {cout << "hello myprint in mythread start i is: " << i << endl;// some code runSleep(1);cout << "hello myprint in mythread finish i is: " << i<<endl;
}
void main() {vector<thread> threads;for (int i = 0; i < 10; ++i) {threads.push_back(thread(myprint, i));}for (auto iter = threads.begin(); iter != threads.end(); ++iter) {iter->join();}cout << "main thread finished!" << endl;
}

2、数据共享分析

只读的数据没有问题

有读有些的时候,如果有2个线程写8个线程读,如果代码没有特别的处理,程序容易崩溃。

解决方案:

读的时候不能写,写的时候不能读,2个线程不能同时写,8个线程也不能同时读。

问题代码(代码时错误的):

#include <thread>
#include <iostream>
#include <vector>
#include <list>
#include <Windows.h>
using namespace std;class RecvQueue {
public:void inMsgRecvQueue() {for (int i = 0; i < 100000; ++i) {cout << "inMsgRecvQueue()执行, 插入一个元素: " << i << endl;msgRecvQueue.push_back(i);}}void outMsgRecvQueue() {for (int i = 0; i < 100000; ++i) {if (!msgRecvQueue.empty()) {int commond = msgRecvQueue.front();msgRecvQueue.pop_front();}else {cout << "outMsgRecvQueue is empty;" << endl;}}}private:std::list<int> msgRecvQueue;
};void main() {RecvQueue myobj;thread myoutqueue(&RecvQueue::outMsgRecvQueue, &myobj);thread myinqueue(&RecvQueue::inMsgRecvQueue, &myobj);myoutqueue.join();myinqueue.join();
}

这篇关于(五)创建和等待多个线程、数据共享问题分析(有读有写)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074601

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错