【问题记录】多线程环境下,使用 std::cout 输出内容会显示混乱

news/2024/7/16 7:56:27 标签: ide, c++

  • Windows 11 家庭中文版
  • Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.5.3

#include <iostream>
#include <Windows.h>

//创建的线程数量
#define THREAD_COUNT    4

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
    UNREFERENCED_PARAMETER(lpParam);    //未使用参数

    std::cout << "Thread " << GetCurrentThreadId() << ": succeeded" << std::endl;
    //printf("Thread %d: executed\n",GetCurrentThreadId());
    Sleep(5);   //模拟线程在任务上花费的时间

    return true;
}

int main()
{
    HANDLE m_thread[THREAD_COUNT] = {nullptr};
    DWORD m_threadID;

    //创建工作线程
    for (int i = 0; i < THREAD_COUNT; i++) {
        m_thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, NULL, 0, &m_threadID);

        std::cout << "Working thread:" << m_threadID << std::endl;
        //printf("Working thread %d\n", m_threadID);

        if (m_thread[i] == NULL) {
            std::cout << "CreateThread error:" << GetLastError() << std::endl;
            //printf("CreateThread error: %d\n", GetLastError());
            return i;
        }
    }

    //关闭线程
    for (int i = 0; i < THREAD_COUNT; i++) {
        CloseHandle(m_thread[i]);
    }
    return 0;
}

  1. 输出内容如下所示,并且每次运行的输出效果都会不一样,这就可能是因为 std::cout 不是线程安全的,无法保持线程同步,所以导致输出内容到窗口会混乱。

  1. 将上述测试代码中的 std::cout 语句注释掉,用 printf 语句打印内容。(这时内容打印正常)
  2. 对于 std::cout 线程不安全问题,目前的想法就是对 std::cout 并加上 mutex 互斥锁做一个封装。

http://www.niftyadmin.cn/n/1170259.html

相关文章

MySQL数据库学习记录

SELECT子句顺序 转载于:https://www.cnblogs.com/panlei3707/p/10075669.html

dfs 深度优先搜索

代码&#xff1a; #include <iostream> using namespace std;int n; //顶点数 const int M 500; int graph[M][M]; bool visit[M];void dfs(int k){visit[k] 1;cout<<k1<<" ";for(int i 0; i < n; i)if(visit[i]0 && graph[k][i]1)d…

Win10 隐藏硬盘上面额外的多个文件夹

方法1、 1、regedit 2、定位 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\ 删除不想要的&#xff0c;然后刷新资源管理器即可。 3D对象对应的&#xff1a; {0DB7E03F-FC29-4DC6-9020-FF41B59E513A} 方法2、 打开 HKEY_LOC…

SVG动画应用-酷炫的图片展示效果

偶然在svgTrick上看到了一个效果&#xff0c;模仿了一下。作者原先也是受到dribble上的一个动效启发&#xff0c;这个效果与svg简直是天作之合。 最后模拟的效果如下&#xff0c;gif有点卡顿&#xff0c;戳戳这里查看网页效果。 做一个酷炫的svg整体效果 我们先看着动效分析一下…

Redis的keys命令到底有多慢?

keys命令的用法&#xff1a; keys pattern查找符合正则匹配的key的列表。扫描对象是Redis服务中所有的key&#xff0c;想想都很慢对不对&#xff1f; 同时执行keys命令的同时&#xff0c;Redis进程将被阻塞&#xff0c;无法执行其他命令&#xff0c;假如超过了哨兵的down-afte…

oracle 12c 怎样配置TNS来访问PDB

2019独角兽企业重金招聘Python工程师标准>>> oracle 12c 怎样配置TNS来访问PDB 淆癏宙 | 浏览 147 次 我有更好的答案 发布于2016-06-27 16:18 最佳答案 1、配置监听 首先要明确&#xff0c;所有的PDB都使用1个监听&#xff0c;配置多个实际上启动时也只有第1个有意…

实现经典的选项卡效果

jQuery UI所支持的选项卡工具集 jQuery UI插件的选项卡也是一种由一系列容器所组成的工具集&#xff0c;这些容器在同一时刻只有一个被打开。每个内容容器由标题和内容构成&#xff0c;当单击内容容器标题时&#xff0c;就可以访问该容器的包含的内容&#xff0c;每一个标题都作…

ubuntu18.04 安装配置nginx+php+mysql

2019独角兽企业重金招聘Python工程师标准>>> 1.首先输入用户名和密码进行登录 2.升级更新软件包 sudo apt-get update sudo apt-get upgrade 判断都填y 3.安装nginx sudo apt-get install nginx 在浏览器输入你的ip地址测试是否安装成功 4.安装数据库 sudo apt-get …