1.调用windows API实现多线程

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <iostream>DWORD WINAPI myfun1(LPVOID lpParameter); //声明线程函数
DWORD WINAPI myfun2(LPVOID lpParameter);using namespace std;int _tmain(int argc, _TCHAR* argv[])
{HANDLE h1,h2;//声明句柄变量h1=CreateThread(NULL,0,myfun1,NULL,0,NULL);//创建线程1cout<<"线程1开始运行!\n"<<endl;h2=CreateThread(NULL,0,myfun2,NULL,0,NULL);//创建线程2cout<<"线程2开始运行!"<<endl;//关闭线程句柄对象CloseHandle(h1);CloseHandle(h2);int n=0;while (1){//cout<<"测试是不是循环重复执行"<<n++<<endl;if (getchar()=='q')//如果用户输入字符q{return 0;//程序正常退出}else{Sleep(100);//程序睡眠}}}//分别实现线程函数,并返回值
DWORD WINAPI myfun1(LPVOID lpParameter)
{cout<<"线程1正在运行"<<endl;return 0;
}DWORD WINAPI myfun2(LPVOID lpParameter)
{cout<<"线程2正在运行"<<endl;return 0;
}

2.使用临界区对象、事件对象和互斥对象三种方法实现多线程同步

#include "stdafx.h"
#include <windows.h>
#include <iostream>using namespace std;DWORD WINAPI myfun1(LPVOID lpParameter); //声明线程函数
DWORD WINAPI myfun2(LPVOID lpParameter);/************使用临界区对象实现多线程同步***************
临界区被初始化后,当程序进入临界区后便拥有临界区的所有权,其余线程无权进入只能等对方释放临界区之后,方可进入临界区拥有其所有权再对临界区进行操作
InitializeCriticalSection()初始化临界区;
EnterCriticalSection()进入临界区;
LeaveCriticalSection()释放临界区所有权并离开临界区;
注意:上述是windows API中相关函数,CCriticalSection类是MFC中定义的临界区类,需要在MFC程序中使用(此程序为控制台程序无法使用MFC类),可以操作临界区,lock锁定临界区、unlock释放临界区临界区为依次访问,不能实现其中一个线程一释放临界区就会被另一个线程访问临界区!不能实现实时监听
********************************************************//************使用事件对象实现多线程同步***************
事件对象是指用户在程序中使用内核对象的有无信号状态实现线程的同步临界区被初始化后,当程序进入临界区后便拥有临界区的所有权,其余线程无权进入只能等对方释放临界区之后,方可进入临界区拥有其所有权再对临界区进行操作
CreatEvent()创建并返回事件对象;
SetEvent()将指定的事件设置为有信号状态(有信号状态下其余线程可以访问);
ResetEvent()将指定的事件设置为无信号状态;
除SetEvent函数外,WaitForSingleObject函数等待指定事件。
注意:上述是Windows API函数,CEvent类是MFC实现事件对象的类事件对象为立即访问,一旦事件对象被设置为有信号 立刻会被其余线程访问!能实现实时监听
********************************************************//************使用互斥对象实现多线程同步***************
互斥对象还可以在进程间使用,在实现线程同步时包含一个线程ID和一个计数器,线程ID表示拥有互斥对象的线程,计数器表示该互斥对象被同一线程所使用次数
CreatMutex()创建并返回互斥对象;
ReleaseMutex()释放互斥对象句柄;
WaitForSingleObject()对该对象进行请求。
注意:上述是Windows API函数,CMutex类是MFC中的互斥对象类互斥对象为立即访问,一旦互斥对象被释放 立刻会被其它正在等待的线程访问!能实现实时监听
********************************************************/static int a=0;
CRITICAL_SECTION section;//定义临界区对象(Windows API)
HANDLE hevent;//定义全局事件变量句柄
HANDLE hmutex;//定义全局互斥对象句柄int _tmain(int argc, _TCHAR* argv[])
{HANDLE h1,h2;//声明句柄变量//InitializeCriticalSection(§ion);//初始化临界区对象(需要在线程前初始化)//hevent=CreateEvent(NULL,FALSE,false,NULL);//创建事件并返回句柄//SetEvent(hevent);//设置事件为有信号状态hmutex=CreateMutex(NULL,false,NULL);//创建互斥对象并返回其句柄h1=CreateThread(NULL,0,myfun1,NULL,0,NULL);//创建线程1cout<<"线程1开始运行!\n"<<endl;h2=CreateThread(NULL,0,myfun2,NULL,0,NULL);//创建线程2cout<<"线程2开始运行!"<<endl;//关闭线程句柄对象CloseHandle(h1);CloseHandle(h2);while (1){if (getchar()=='q')//如果用户输入字符q{//DeleteCriticalSection(§ion);//删除临界区对象return 0;//程序正常退出}else{Sleep(100);//程序睡眠}}return 0;}//分别实现线程函数,并返回值
DWORD WINAPI myfun1(LPVOID lpParameter)
{while (true){//EnterCriticalSection(§ion);//进入临界区//WaitForSingleObject(hevent,INFINITE);//请求事件对象//ResetEvent(hevent);//设置事件对象为无信号状态WaitForSingleObject(hmutex,INFINITE);//请求互斥对象a++;if (a<1000){cout<<"线程1正在计数"<<a<<endl;//LeaveCriticalSection(§ion);//离开临界区//SetEvent(hevent);ReleaseMutex(hmutex);//释放互斥对象句柄}else{//a=0;//LeaveCriticalSection(§ion);//SetEvent(hevent);ReleaseMutex(hmutex);//释放互斥对象句柄break;}}return 0;
}DWORD WINAPI myfun2(LPVOID lpParameter)
{
//  a=0;while (true){//EnterCriticalSection(§ion);//进入临界区//WaitForSingleObject(hevent,INFINITE);//请求事件对象//ResetEvent(hevent);//设置事件对象为无信号状态WaitForSingleObject(hmutex,INFINITE);//请求互斥对象a++;if (a<1000){cout<<"线程2正在计数"<<a<<endl;//LeaveCriticalSection(§ion);//离开临界区//SetEvent(hevent);ReleaseMutex(hmutex);//释放互斥对象句柄}else{//LeaveCriticalSection(§ion);//离开临界区,当计数a大于1000时退出循环//SetEvent(hevent);ReleaseMutex(hmutex);//释放互斥对象句柄break;}}return 0;
}

C++实现多线程及其三种方法实现多线程同步相关推荐

  1. Python创建多线程的三种方法

    Python创建多线程的三种方法 thread模块函数式创建线程 继承threading类创建多线程 threading模块函数式创建线程 使用总结 thread模块函数式创建线程 调用thread模 ...

  2. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

  3. python3创建多线程的几种方法

    python3创建多线程主要有下面两种方法:函数.类 1.函数创建多线程 python3中,提供了一个内置模块threading.Thread,可以很方便的创建多线程,threading.Thread ...

  4. Qt创建多线程的两种方法

    来源:https://github.com/czyt1988/czyBlog/tree/master/tech/QtThread 1.摘要 Qt有两种多线程的方法,其中一种是继承QThread的run ...

  5. 创建多线程有几种方法?如何创建线程?

    多线程有几种实现方法? 多线程实现又3种方法,其中前两中是常用的方法,推荐第二种方法,一个类应该在其修改或者加强是才继承 1.继承Thread类,重写run()方法,实例化该类,调用线程start() ...

  6. 对Java多线程编程的初步了解,实现多线程的三种方式以及多线程并发安全的线程同步机制

    什么叫进程?什么叫线程? 进程相当于一个应用程序,线程就是进程中的一个应用场景或者说是一个执行单元,一个进程可以启动多个线程,每个线程执行不同的任务,一个线程不能单独存在,他必须是进程的一部分,当进程 ...

  7. python多线程的几种方法

    python多线程编程 Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程 ...

  8. Java创建多线程的三种方法

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  9. Java多线程之实现多线程的三种方法

    一.创建多线程的方法 1.继承Thread类类 Thread的类头为:public class Thread implement runnable继承Thread类,并重写Thread中的run方法例 ...

最新文章

  1. Missing separate debuginfos, use: debuginfo-install
  2. 使用NodeList
  3. Direct I/O
  4. Go语言字典树定义及实现
  5. ARC中block块作为属性的使用笔记
  6. 用Artifactory管理内部Maven仓库
  7. 网银无法登录解决办法
  8. [转]云原生到底是什么?
  9. java怎么实现同步到微博功能_新浪微博信息站外同步的完整实现
  10. 作者:曾伟,电子科技大学副教授。
  11. vscode比较整个文件夹_vscode开发ROS1(5)-ROS工程目录结构
  12. 前端实战项目:前端框架Vue3.0项目教程(一)Vue3.0环境的搭建
  13. 一文讲懂蓝绿发布和金丝雀发布
  14. 39、C++定义一个类,实现向量的加减运算
  15. android 调用hal,Android HAL层的使用方法总结
  16. tinymce移动端使用_中小站长该如何做好移动端SEO优化
  17. matlab电影,如何制作电影(与matlab相关)?
  18. NodeJS C++ Addons之C++类实例包装与异步操作
  19. 结合Elementplus源码讲解BEM的使用
  20. 剑指offer之二叉搜索树的后序遍历序列

热门文章

  1. EIGRP特点包括:
  2. VSCode Git 使用 GPG
  3. 一个后端工程师如何实现漂亮的后台管理系统
  4. linux字符终端浏览器-----Lynx
  5. mysql 中文数字转换_数据库中数字和中文的转换问题
  6. 5G/NR中RRC的三种状态(idle, active, inactive)
  7. Hadoop中的slaves文件
  8. 领域驱动设计战术模式:领域事件
  9. 使用NoteExpress引入参考文献
  10. DWD层 (用户行为日志)