c++ 快速循环向线程池添加任务,任务执行不正常

我不在你不在 2019-01-17 11:00:05

// Highthread.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <thread>
#include <iostream>
#include <fstream>
#include <time.h>
#include "mypool.h"
#include <windows.h>
using namespace std;
mutex mylock;
ofstream logfile,logfile1;
void outp(int a)
{
logfile << a << endl;
logfile.flush();
}
void outpp(int a)
{
logfile1 << a << endl;
logfile1.flush();
}
int main()
{
logfile.open("d:/2.txt");
int i = 0;
while (i < 1000)
{
thread th(outp, i);
th.detach();
i++;
}
ThreadPool myppp(8);
while (i < 1000)
{
//Sleep(1); 加入这句写入的文件才正常
//如果用Sleep来等待才能添加任务,和用线程池来解决高并发任务就违背了,如何解决这个问题呢?
myppp.enqueue([&] {outpp(i); });
i++;
}
cout << "done" << endl;
logfile1.close();
getchar();
return 0;
}


第一个循环体写入的文件,是正常的,执行时间1.3秒左右;
第二个循环体 采用向线程池中添加任务的方式,写出的文件如下,有的数字重复,有的漏掉;
如果在添加任务(myppp.enqueue([&] {outpp(i); });)语句前 Sleep(1),写出的文件才是正常的---不重复,不遗漏;
搞不懂为什么;
...全文
340 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
独孤过 2019-01-19
  • 打赏
  • 举报
回复
楼上说得对,操作系统切换线程需要时间,只加互斥锁,未做同步顺序当然会乱。 可以设置更新标志,在读之时判断标志是否为更新状态,若是则放弃读取,如果不是,读取新内容,之后设置为已更新;在写之时,判断是否为更新状态,若是则写入新内容,之后设置为未更新,如果不是,放弃写入文件。 由于多线程访问同一标志,可以使用原子std::atomic_bool,此外,建议采用内存缓冲,减少IO次数。
我不在你不在 2019-01-18
  • 打赏
  • 举报
回复
引用 4 楼 CT8100的回复:

这么多线程写一个文件,你也不加锁的
为了贴上来时候代码简洁些,故意把锁去掉了,
CT8100 2019-01-18
  • 打赏
  • 举报
回复

这么多线程写一个文件,你也不加锁的
CT8100 2019-01-18
  • 打赏
  • 举报
回复
如果多线程同时展开,如果你没有控制优先级的话,文件不乱就不正常了吧。。。而且操作系统进行线程切换也是需要时间的吧。。
我不在你不在 2019-01-17
  • 打赏
  • 举报
回复
引用 2 楼 qq_36576377 的回复:
[quote=引用 1 楼 @风轻云淡_ 的回复:]
是不是多线程操作了。一般多线程操作都需要加互斥锁,你加互斥锁试一下。

用mutex加互斥锁,写出的文件的数字仍然会重复,遗漏;
用网上不同的线程池,都是一样;都需要Sleep才能写文件正常;[/quote]
加了互斥锁后,书写顺序对了,但仍会重复遗漏,类似如下:
2
2
2
3
7
7
7
我不在你不在 2019-01-17
  • 打赏
  • 举报
回复
引用 1 楼 @风轻云淡_ 的回复:
是不是多线程操作了。一般多线程操作都需要加互斥锁,你加互斥锁试一下。

用mutex加互斥锁,写出的文件的数字仍然会重复,遗漏;
用网上不同的线程池,都是一样;都需要Sleep才能写文件正常;
@风轻云淡_ 2019-01-17
  • 打赏
  • 举报
回复
是不是多线程操作了。一般多线程操作都需要加互斥锁,你加互斥锁试一下。

64,654

社区成员

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

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