百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

5分钟学会C/C++多线程编程进程和线程

yuyutoo 2025-05-11 02:40 2 浏览 0 评论

前言

对线程有基本的理解

简单的C++面向过程编程能力

创造单个简单的线程。

创造单个带参数的线程。

如何等待线程结束。

创造多个线程,并使用互斥量来防止资源抢占。

会使用之后,直接跳到“汇总”,复制模板来用就行

相关博客:实现一个简单的线程池


线程教程

今天就分享到这咯有一起学习的可以关注一下,一起学习有哪里不对的大家也可以评论,相关视频资料可以后台私信‘资料’领取

资料内容包括:C/C++,Linux,Nginx,golang,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,ffmpeg,流媒体, 音视频,CDN,P2P,K8S,Docker,Golang,TCP/IP,协程,嵌入式,ARM,DPDK等等。。。


创建一个线程:CreateThread()

函数声明

//返回值:一个HANDLE类型的值,表示线程的句柄,可用于等待线程等函数

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, // 不重要,一般设置为NULL

SIZE_T dwStackSize, // 堆栈大小,不重要,一般设置为0,表示使用默认堆栈大小

LPTHREAD_START_ROUTINE lpStartAddress, // 函数指针,传入函数名或指针即可

__drv_aliasesMem LPVOID lpParameter, // 参数指针,供函数使用

DWORD dwCreationFlags, // 不重要,一般设置为0

LPDWORD lpThreadId // 指针,用于保存线程的id,一般设置为NULL

);]


使用方法

// 声明线程函数的模板:

DWORD WINAPI threadname(LPVOID lpParamter) // 函数名字可随意

{

/*

这里填入你的代码

*/

return 0L;

}

// 根据声明的函数创造一个线程

// 若函数没有参数,传入函数名字即可,其它参数参考下方示例

HANDLE hThread = CreateThread(NULL, 0, threadname, NULL, 0, NULL);


使用实例

记得等待线程结束!不然函数(不一定是主函数哦,而是CreatThread所处的函数)结束退出后,会释放资源,导致未结束的线程产生各种奇怪的错误!

#include<iostream>

#include<windows.h>

using namespace std;

// 编写了一个我的线程函数

DWORD WINAPI MyThread(LPVOID lpParamter)

{

cout << "fuck the multithread !\n";

return 0L;

}

int main ()

{

// 创造线程

CreateThread(NULL, 0, MyThread, NULL, 0, NULL);

// 记得等待线程结束

system("PAUSE");

return 0;

}


运行结果:

fuck the multithread !

创建一个带参线程:lpParameter参数

关于void类型指针

1.void指针是一种特别的指针
void *vp
//说它特别是因为它没有类型
//或者说这个类型不能判断出指向对象的长度
2.任何指针都可以赋值给void指针
type *p;
vp=p;
//不需转换
//只获得变量/对象地址而不获得大小
3.void指针赋值给其他类型的指针时都要进行转换
type *p=(type*)vp;
//转换类型也就是获得指向变量/对象大小

:http://icoding.spaces.live.com/blog/cns!209684E38D520BA6!130.entry

4.void指针不能复引用
*vp//错误
因为void指针只知道,指向变量/对象的起始地址
而不知道指向变量/对象的大小(占几个字节)所以无法正确引用
5.void指针不能参与指针运算,除非进行转换
(type*)vp++;
//vp==vp+sizeof(type)

等待指定线程结束:WaitForSingleObject()

这个特别简单,此函数就两个参数,第一个参数是创建线程时可得到的返回值(HANDLE)也就是句柄,第二个参数不用关心,传入INFINITE就行了。

使用实例:

HANDLE hThread = CreateThread(NULL, 0, thread1, NULL, 0, NULL);

// 利用得到的句柄等待线程结束

WaitForSingleObject(hThread, INFINITE);

有了这个函数,再也不用Sleep或者While(1)啦。

多线程资源加锁:CreateMutex()

一、创建 创建互斥锁的方法是调用函数CreateMutex: CreateMutex(&sa, bInitialOwner, szName);第一个参数是一个指向SECURITY_ATTRIBUTES结构体的指针,一般的情况下,可以是nullptr。 第二个参数类型为BOOL,表示互斥锁创建出来后是否被当前线程持有。 第三个参数类型为字符串(const TCHAR*),是这个互斥锁的名字,如果是nullptr,则互斥锁是匿名的。 例: HANDLE hMutex = CreateMutex(nullptr, FALSE, nullptr);上面的代码创建了一个匿名的互斥锁,创建出来后,当前线程不持有这个互斥锁。

二、持有 WaitForSingleObject函数可以让一个线程持有互斥锁。用法: WaitForSingleObject(hMutex, dwTimeout);这个函数的作用比较多。这里只介绍第一个参数为互斥锁句柄时的作用。 它的作用是等待,直到一定时间之后,或者,其他线程均不持有hMutex。第二个参数是等待的时间(单位:毫秒),如果该参数为INFINITE,则该函数会一直等待下去。

三、释放 用ReleaseMutex函数可以让当前线程“放开”一个互斥锁(不持有它了),以便让其他线程可以持有它。用法 ReleaseMutex(hMutex)

四、销毁 当程序不再需要互斥锁时,要销毁它。 CloseHandle(hMutex)

五、命名互斥锁 如果CreateMutex函数的第三个参数传入一个字符串,那么所创建的锁就是命名的。当一个命名的锁被创建出来以后,当前进程和其他进程如果试图创建相同名字的锁,CreateMutex会返回原来那把锁的句柄,并且GetLastError函数会返回ERROR_ALREADY_EXISTS。这个特点可以使一个程序在同一时刻最多运行一个实例。


总结;

采用互斥对象机制。互斥锁,像一个物件,这个物件只能同时被一个线程持有。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享

相关推荐

几个经典的linux c多线程面试题解析

一、线程与进程的区别?1、线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。2、一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程...

C语言中的信号处理和多线程编程(c语言中的信号处理和多线程编程一样吗)

信号处理和多线程编程是C语言中常用的两个特性,它们为开发人员提供了一种灵活和高效的方式来处理异步事件和并发任务。signal.h和threads.h是两个常用的头文件,它们提供了一些函数和数据结构,用...

C++ 多线程(C++ 多线程面试题)

多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同...

C#多线程下的调优(c# 多线程 ui)

目录一、原子操作1.基于Lock实现2.基于CAS实现3.自旋锁SpinLock4.读写锁ReaderWriterLockSlim...

5分钟学会C/C++多线程编程进程和线程

前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...

c语言的多线程编程(c语言的多线程编程是什么)

我们进行嵌入式开发时通常遇到需要对多个任务处理,有的可以使用单片机的中断,同时也可以利用多线程进行任务处理。c语言里的多线程的编写需要引入pthread.h这个头文件,我是在Linux下进行的编写首先...

每个程序员应该彻底掌握的多线程编程(Linux C)

多线程编程可以说每个程序员的基本功,同时也是开发中的难点之一,本文以LinuxC为例,讲述了线程的创建及常用的几种线程同步的方式,最后对多线程编程进行了总结与思考并给出代码示例。一、创建线程多线程编...

浅谈Kafka2.8+在Windows下的搭建与使用

前言:周末空闲时间无意找到了一套个性化推荐的源码,整体项目运用了SSH,HDFS,Flume,Hive,Kafka,Spark,Scala等。运行时,本来通过spark计算业务埋点数据时,却发现本地没...

Zend Studio使用教程:将Zend Studio作为插件安装

ZendStudio是新一代的专业级智能PHPIDE,它旨在帮助开发人员提高工作效率,创造出高品质的PHP应用程序!它包含了PHP开发所必须的部件,通过一整套的编辑、调试、分析、优化和数据库工具,...

10款Web程序员必备的CSS工具(web开发css)

对于web开发来说,CSS是最有效的美化页面、设置页面布局的技术。但问题是,CSS是一种标记性语言,语法结构非常的松散、不严谨。WEB程序员会经常发现自己的或别人的CSS文件里有大量的冗余代码或错误或...

C/C++开发者必备:十款免费集成开发环境IDE

集成开发环境(IDE,IntegratedDevelopmentEnvironment)主要用于提供应用程序开发的环境,通常包括编辑器、编译器、调试器等。IDE的种类很多,有的只支持一种特定的编程...

推荐给系统管理员的10款Linux GUI工具

ZD至顶网CIO与应用频道12月18日专栏:如果你是系统管理员,现在到了一个必须掌握Linux的时候,特别是当你工作在一个更大规模环境下。很多机构已经从Windows迁移出来,在Windows环境...

盘点Linux平台下的十佳IDE(linux 软件推荐)

Linux是一款在全球范围内应用于许多台式机的开源操作系统,同时它还是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议,...

新闻发布系统(源代码)(新闻发布系统详细设计)

昨天我说要把这俩系统整合一下!!!结果可以说成功了,也可以说是失败了。虽然两个融合在了一起,但只限在本地访问,连同一局域网都不行。因为两个系统是通过绝对地址相互链接的,所以我用的是localhost(...

SpiderFlow - 一个无需写代码的爬虫平台

网络爬虫,是互联网数据抓取的主要方式之一,许多人都会有类似的需求。然而,网络爬虫的编写,通常需要掌握一定的代码编写能力,乃至于比较复杂的项目组织构建能力,有一定的技术门槛。SpiderFlow,通过可...

取消回复欢迎 发表评论: