学习笔记

Windows多线程控制台程序目的:学习和掌握如何编写Windows多线程控制台程序。通过编写程序,加深对进程和线程关系的理解,掌握多线程程序的执行和编写技巧。设计要求:写一个单进程多线程的Windows控制台程序,该程序在一个进程内建立N个线程来执行指定的任务。N由命令行传递给系统。Win32控制台程序中,主函数的格式如:Void main(int argc,char *argv[]),可以获取命令行参数。通过VC++“工程/设置”的C/C++属性页设置应用程序为“MTD”多线程。利用win32 API CreateThread()来生成线程。

#include <stdio.h>
#include <windows.h>          // for HANDLE
#include <process.h>          // for _beginthread()
#include <stdlib.h>// 终端运行
// gcc main.c -o a
// .\a.exe 6DWORD WINAPI thread(LPVOID lpParam)  //子线程入口函数
{int * k = (int *)lpParam;int b = 0;while(b<4){printf("这是子线程   %d\n", *k);Sleep(50);b++;}return 1;
}int main(int argc, char* argv[])
{// 主函数的格式如:Void main(int argc,char *argv[]),可以获取命令行参数。// 字符串转数字 atoi()函数printf("需要创建线程个数 %d\n",atoi(argv[1]));int num = atoi(argv[1]);HANDLE hThead[num];    //用于存储线程句柄  DWORD  ThreadID[num];  //子线程IDint n[num];            //子线程函数参数int i=0;//创建子线程for(i=1;i<=num;i++){n[i]=i;hThead[i] = CreateThread(NULL,    // security,安全属性0,                   // stack size  线程堆栈大小thread,              //子线程入口函数&n[i],               // arg list  函数参数地址 数字n[] 每个子项地址不同CREATE_SUSPENDED,    //先挂起该线程&ThreadID[i]);       //线程标识符 ID编号if (hThead[i] == 0) { //如果返回的hThead[i]的值为0 则表示创建子线程失败printf("创建线程失败 %d\n", i);} else {printf("创建线程成功 %d\n", i);}   }for(i=1;i<=num;i++){ResumeThread(hThead[i]);   // 激活线程printf("激活线程 %d\n", i);}for(i=1;i<=num;i++){WaitForSingleObject(hThead[i],INFINITE);}printf("等待所有线程运行完毕 \n");for(i=1;i<=num;i++){CloseHandle(hThead[i]);  //关闭句柄}printf("已关闭所有线程\n");system("pause");return 0;
}

运行结果:

D:\CandC++\cCode\线程>gcc main.c -o aD:\CandC++\cCode\线程>.\a.exe 6
需要创建线程个数 6
创建线程成功 1
创建线程成功 2
创建线程成功 3
创建线程成功 4
创建线程成功 5
创建线程成功 6
激活线程 1
激活线程 2
激活线程 3
激活线程 4
激活线程 5
激活线程 6
这是子线程   2
这是子线程   4
这是子线程   1
这是子线程   3
这是子线程   5
这是子线程   6
这是子线程   1
这是子线程   2
这是子线程   4
这是子线程   6
这是子线程   3
这是子线程   5
这是子线程   1
这是子线程   2
这是子线程   4
这是子线程   6
这是子线程   3
这是子线程   5
这是子线程   1
这是子线程   4
这是子线程   2
这是子线程   6
这是子线程   3
这是子线程   5
等待所有线程运行完毕
已关闭所有线程
Active code page: 65001
Press any key to continue . . .

如果把第三个等待的for循环替换成

 // for(i=1;i<=num;i++){//     WaitForSingleObject(hThead[i],INFINITE);// }WaitForMultipleObjects(num,hThead,TRUE,INFINITE);printf("等待所有线程运行完毕 \n");

输出结果则为

需要创建线程个数 6
创建线程成功 1
创建线程成功 2
创建线程成功 3
创建线程成功 4
创建线程成功 5
创建线程成功 6
激活线程 1
激活线程 2
激活线程 3
激活线程 4
激活线程 5
激活线程 6
这是子线程   1
这是子线程   4
这是子线程   2
这是子线程   3
这是子线程   5
等待所有线程运行完毕
这是子线程   6
已关闭所有线程
这是子线程   1
这是子线程   2
这是子线程   4
这是子线程   3
这是子线程   5
这是子线程   6
这是子线程   1
这是子线程   2
这是子线程   4
这是子线程   3
这是子线程   5
这是子线程   6
这是子线程   1
这是子线程   2
这是子线程   4
这是子线程   3
这是子线程   5
这是子线程   6
Active code page: 65001

逻辑混乱

Windows多线程控制台程序相关推荐

  1. Windows多线程应用程序的编译和链接

    编译多线程应用程序的第一步是要确保编译器使用了正确的运行时库:MS为C运行时库提供了几个不同的实现.这些版本在以下3个标准上有所不同:链接方式(静态or动态).是否可再入(有一个库是为单线程应用程序设 ...

  2. 【错误记录】Windows 控制台程序编译报错 ( WINDOWS.H already included. MFC apps must not #include <Windows.h> )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Windows 控制台程序编译报错 : 已启动生成- 1>------ 已启动生成: 项目: hacktool, 配置: Debug Win3 ...

  3. 【Visual Studio】Visual Studio 2019 创建 Windows 控制台程序 ( 安装 ‘使用 C++ 的桌面开发‘ 组件 | 创建并运行 Windows 控制台程序 )

    文章目录 一.安装 C++ 桌面开发组件 二.创建并运行 Windows 控制台程序 一.安装 C++ 桌面开发组件 打开 Visual Studio Installer , 点击 " 修改 ...

  4. Windows控制台程序处理消息编程实例二则

    一 控制台程序处理Windows消息 #include <stdio.h> #include <windows.h>BOOL WINAPI ConsoleHandler(DWO ...

  5. idea创建三种应用程序的方法:springboot,控制台程序,windows服务程序

    springboot项目 控制台程序 windows服务程序 环境:idea 2017 + Maven 3.3.9+jdk 1.8 一.springboot项目 创建过程依次如下图所示: 至此一个简单 ...

  6. windows程序和控制台程序

    入口 windows程序的入口函数为winmain winmain 控制台程序的入口函数为main 形式 windows程序是窗口程序 控制台程度是模拟dos的控制台输出类程序 报错 error LN ...

  7. 怎样在windows环境中启动某控制台程序并改变它的stdin、stdout和stderr? http://book.77169.org/ask18/how106297.htm

    ? MSDN里面有一些文档可以看看,方法是利用CreateProcess的 LPSTARTUPINFO 参数, 设置dwFlags为STARTF_USESTDHANDLES: 然后自定义: HANDL ...

  8. C#控制台程序注册成Windows服务

    在控制台程序中新增项目-->"Windows服务" 修改名称,我这里叫"Test_WindowsService" 然后在新增的"Windows服 ...

  9. 浅析C#中构建多线程应用程序

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

最新文章

  1. Java 理论与实践: 流行的原子——新原子类是 java.util.concurrent 的隐藏精华(转载)...
  2. 关于jConfirm回传的解决方案
  3. HTML学习笔记之二(回到顶部 与 回到底部)
  4. 第七天2017/04/14(引用与const、C++基本知识)
  5. C语言 什么时候用取地址什么时候不用取地址,符号讲解
  6. 我国在量子计算机领域的发展情况的感受,量子计算机的现状及发展趋势.doc
  7. 配置Struts2的异常处理
  8. openssl、gmssl的简单介绍
  9. 锐捷交换机堆叠配置举例
  10. 张飞电子工程师速成视频教程百度云_张飞电子工程师速成视频教程第二部
  11. 【cocos源码学习】cocos2d-x-4.0 Android Demo工程结构的简析
  12. linux 根目录设置777,linux 把根目录设置成777权限的补救方法
  13. 钓鱼篇-CHM电子书上线CS
  14. h5 上 删除 交互_iH5高级教程:H5交互进阶,擦一擦效果
  15. 基于android的个人理财软件 android stu_Android聊天软件开发(基于网易云IM即时通讯)——注册账号(二)...
  16. 音响设备常用连接头及音视频线材的制作方法
  17. 计算机主板 辐射,一直被忽视!电脑电磁辐射危害及机箱选择
  18. java解析宏文件,从命令行或批处理文件运行Excel宏的方法?
  19. C++Primer阅读笔记
  20. 什么叫JAVA驻场开发,它有什么优势和不足

热门文章

  1. 智能投顾并非AI 投资圈开始谈论“智能泡沫”
  2. 【工具】MySQL Workbench使用教程
  3. Executors和ThreadPoolExecutor详解
  4. python 定义函数方法_Python定义一个函数的方法
  5. ucf 转xdc_如何用vivado将ucf转成xdc
  6. 《西河大鼓——霸桥挑袍》(唱词文本)
  7. 移动云平台OneNet之数据可视化View连接本地MySQL数据库
  8. js中判断变量不为空或null或“”
  9. 初识人脸识别(2)-- 积分图
  10. 创新型智慧农业信息化系统建设方案