c++ 多线程

归途醉染 2019-06-20 12:11:04
请教一下 c++ 中多线程并发与并行

比如我想创建多个线程同时去读写文件 是否要加锁 加锁后 不就是排队了吗 那这样是不是并行转变成并发了?

问题案例:

我使用多线程把文件内容全部读取出来 文件格式为压缩包 内存很大 我想在某一个目录内 创建一个多线程 每一个线程去读一个文件(打个比方
目前有4个压缩包,我创建多线程 每个压缩包分配一个线程去读 读完就退出)
请问我应该如何去做

我现在卡在创建多线程是用for循环去创建吧?,要不要加锁 加锁后是不是不是同时一起走 (加锁应该有先后顺序)不加锁会不会造成资源泄露

比如我可以一边听歌一边聊天一边写代码


可以教我一下思想或者一个小小案例 让我有思路吗? 加锁之后就不能做到同时了吧!!!!
请大家多度指教 多谢
...全文
160 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
走好每一步 2019-06-21
  • 打赏
  • 举报
回复
ThreadPool了解一下
走好每一步 2019-06-20
  • 打赏
  • 举报
回复
获取文件名列表 for (文件名:列表) 为每一个文件名分配一个线程去读
归途醉染 2019-06-20
  • 打赏
  • 举报
回复
问题就是出在这个:"同时上"
归途醉染 2019-06-20
  • 打赏
  • 举报
回复
顺便问问手机端怎么结帖了
归途醉染 2019-06-20
  • 打赏
  • 举报
回复
引用 15 楼 提及 的回复:
[quote=引用 10 楼 归途醉染 的回复:] 比如 for(int i =0;i<10;i++) createthread (null ,0,Pro,0,Null); 这样不是在同一个pro线程回调函数去读写吗? 我出在不知道怎么创建和分配线程 主要是概念有点模糊
我读这句话为什么会理解为:不同的线程调用同一个函数呢(一个函数栈帧)。大白话,4个人一辆车, 多线程是4个人,每人一辆车[/quote]嗯,但是回调函数一样的 比如四个人坐一模一样的4量大巴
提及 2019-06-20
  • 打赏
  • 举报
回复
引用 10 楼 归途醉染 的回复:
比如 for(int i =0;i<10;i++) createthread (null ,0,Pro,0,Null); 这样不是在同一个pro线程回调函数去读写吗? 我出在不知道怎么创建和分配线程 主要是概念有点模糊
我读这句话为什么会理解为:不同的线程调用同一个函数呢(一个函数栈帧)。大白话,4个人一辆车, 多线程是4个人,每人一辆车
归途醉染 2019-06-20
  • 打赏
  • 举报
回复
引用 13 楼 gouyanfen 的回复:
[quote=引用 12 楼 归途醉染 的回复:] [quote=引用 11 楼 gouyanfen 的回复:] ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)线程函数,线程参数结构指针,NULL,NULL);// 结构指针自己定义 比如 struct threadlparam { char filename[64]; int i; }; threadlparam mythreadlparam; ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)线程函数,&mythreadlparam,NULL,NULL);// 线程内部直接强制转换指针类型,分出参数,对应处理 int WINAPI 线程函数(LPVOID pParam) { threadlparam * myserverpoint=(threadlparam*)pParam; .... return 0; }
这样就可以根据文件名去创建线程了吗?会不会抢资源?线程的先后顺序无法确定了吧?那我如果通过网络发送数据的话 (我是读取1024字节就发送一次数据给服务器那边写)这样服务器那边怎么去区分多个线程读取的数据是属于那个文件的?[/quote] 都不是共同的资源,肯定不会抢资源了。至于通过网络发的话看你怎么设计了,通过不同的连接区分也可以,通过自定义协议区分也可以 [/quote]好的 多谢了
gouyanfen 2019-06-20
  • 打赏
  • 举报
回复
引用 12 楼 归途醉染 的回复:
[quote=引用 11 楼 gouyanfen 的回复:] ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)线程函数,线程参数结构指针,NULL,NULL);// 结构指针自己定义 比如 struct threadlparam { char filename[64]; int i; }; threadlparam mythreadlparam; ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)线程函数,&mythreadlparam,NULL,NULL);// 线程内部直接强制转换指针类型,分出参数,对应处理 int WINAPI 线程函数(LPVOID pParam) { threadlparam * myserverpoint=(threadlparam*)pParam; .... return 0; }
这样就可以根据文件名去创建线程了吗?会不会抢资源?线程的先后顺序无法确定了吧?那我如果通过网络发送数据的话 (我是读取1024字节就发送一次数据给服务器那边写)这样服务器那边怎么去区分多个线程读取的数据是属于那个文件的?[/quote] 都不是共同的资源,肯定不会抢资源了。至于通过网络发的话看你怎么设计了,通过不同的连接区分也可以,通过自定义协议区分也可以
归途醉染 2019-06-20
  • 打赏
  • 举报
回复
引用 11 楼 gouyanfen 的回复:
::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)线程函数,线程参数结构指针,NULL,NULL);// 结构指针自己定义 比如 struct threadlparam { char filename[64]; int i; }; threadlparam mythreadlparam; ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)线程函数,&mythreadlparam,NULL,NULL);// 线程内部直接强制转换指针类型,分出参数,对应处理 int WINAPI 线程函数(LPVOID pParam) { threadlparam * myserverpoint=(threadlparam*)pParam; .... return 0; }
这样就可以根据文件名去创建线程了吗?会不会抢资源?线程的先后顺序无法确定了吧?那我如果通过网络发送数据的话 (我是读取1024字节就发送一次数据给服务器那边写)这样服务器那边怎么去区分多个线程读取的数据是属于那个文件的?
gouyanfen 2019-06-20
  • 打赏
  • 举报
回复
::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)线程函数,线程参数结构指针,NULL,NULL);// 结构指针自己定义 比如 struct threadlparam { char filename[64]; int i; }; threadlparam mythreadlparam; ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)线程函数,&mythreadlparam,NULL,NULL);// 线程内部直接强制转换指针类型,分出参数,对应处理 int WINAPI 线程函数(LPVOID pParam) { threadlparam * myserverpoint=(threadlparam*)pParam; .... return 0; }
归途醉染 2019-06-20
  • 打赏
  • 举报
回复
比如 for(int i =0;i<10;i++) createthread (null ,0,Pro,0,Null); 这样不是在同一个pro线程回调函数去读写吗? 我出在不知道怎么创建和分配线程 主要是概念有点模糊
归途醉染 2019-06-20
  • 打赏
  • 举报
回复
引用 5 楼 636f6c696e 的回复:
不同的压缩包不同的线程去处理,为啥要加锁? 你的难点到底是啥?多线程处理结果不知道怎么汇总到主线程?
我比如说要创建一个多线程 是循环创建吗? 然后线程函数是不是同一个?
归途醉染 2019-06-20
  • 打赏
  • 举报
回复
引用 3 楼 gouyanfen 的回复:
不同的文件,不同的线程,要锁干什么
是啊 我就想这样应该实现 比如楼上这位兄弟所说 为每一个文件名创建一个线程 问题这个线程函数是同一个回调函数吗? 这样会不会造成资源重复读写
gouyanfen 2019-06-20
  • 打赏
  • 举报
回复
引用 6 楼 归途醉染 的回复:
[quote=引用 2 楼 走好每一步 的回复:]获取文件名列表 for (文件名:列表) 为每一个文件名分配一个线程去读
你这个线程函数都是同一个函数吗?[/quote] 功能一样,传不同的传数进去就行了,不需要每个写一个线程函数
归途醉染 2019-06-20
  • 打赏
  • 举报
回复
引用 2 楼 走好每一步 的回复:
获取文件名列表 for (文件名:列表) 为每一个文件名分配一个线程去读
你这个线程函数都是同一个函数吗?
636f6c696e 2019-06-20
  • 打赏
  • 举报
回复
不同的压缩包不同的线程去处理,为啥要加锁? 你的难点到底是啥?多线程处理结果不知道怎么汇总到主线程?
android2008 2019-06-20
  • 打赏
  • 举报
回复
锁是当不同线程访问同一个资源(文件,内存等)时才需要
gouyanfen 2019-06-20
  • 打赏
  • 举报
回复
不同的文件,不同的线程,要锁干什么

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧