首页 > 编程知识 正文

c语言多线程传递参数,c异步多线程

时间:2023-05-04 23:39:59 阅读:17425 作者:4146

提示:写完文章后,目录可以自动生成。 如何生成可以引用右侧的帮助文档

文章目录1、线程和多线程多线程2、c中多线程的实现1 .概述2 .具体实现3、代码示例4、问题

另一方面,线程和多线程是操作系统对运算调度的最小单元,它包含在进程中,是进程的实际操作单元。 一个线程是进程中一个顺序的控制流,它允许在一个进程中同时执行多个线程,并允许每个线程并行执行不同的任务。

多线程简单地说,线程是调度和分配的基本单元。 因此,引入多线程的概念意味着提高调度和分配效率,提高程序的运行效率。 多线程的存在可以将一个任务分解成许多小部分,每个小部分不仅只能按顺序执行,而且可以同时执行以节省时间。 关于加法,将所有数据一起相加与将段相加没有区别。

二、c中的多线程实现1 .配置文件传统的C(C98 )没有引入线程这一概念。 linux和unix操作系统的设计采用多进程,进程之间的通信非常方便,同时进程之间有相互独立的空间,不会污染其他进程的数据,天然的隔离性给程序的稳定性带来很大的保障传言说线程一直不是linux或unix推荐的技术,linus本人非常讨厌线程的概念。 随着C市场份额被Java、Python等语言蚕食,为了使C符合现代语言的特性,在C 11中引入了多线程和并发技术。

2 .在具体实现c 11中,需要使用类对象thread (即线程类)来实现并引入头文件thread,其中对创建了一个thread类的对象启动线程。

使用方法如下。

thread first (函数名称、参数1、参数2 . ); 对于没有thread的文件,main函数是其唯一线程,也称为主线程。 对于包含thread的文件,如果创建thread对象,然后在主线程外创建子线程,则无论主线程如何,都将立即开始运行。

但是,对于子线程,不知道什么时候调度执行,什么时候执行结束。 例如,作为主线程的main函数的执行结束时,整个程序结束,但子线程不得不在执行未结束的情况下中止,这样无法实现目的,因此导入两个函数。

join (函数。

thread first (函数名称、参数1、参数2 . ); first.join (; 在此,join函数的功能是块,主线程必须等待子线程结束,即同步作用。

数据(函数

主线程表示两者脱离关系,完全放飞自己,而无需等待子线程执行完成。 这个一般在守护程序线程中使用。 有时我们需要建立暗中观察的线程,静静地调查程序的某种状态。 这样的东西叫做守护程序线程。 主线程被销毁后,该线程将自动销毁。 注意:因为c的标准线程函数只返回void,所以需要从线程返回值往往采用传递引用的方法。

三、代码示例此示例使用10000000个1加法的常规实现和多线程实现比较执行效率。 其中,为了检测运行时,引入了time头文件的实现。

常规实现代码:

# include iostream # include vector # include algorithm # include thread # include numeric # include time.husingnamespacestd; //线程所做的就是在此线程函数中添加voidgetsumt (矢量int 33603360 iterator first,矢量int :3360 iterator last, 调用写为int result (result=AC cult )的//c标准库算法(}int main )//主线程) { clock_t start_time,end _ start_time=clock (; //获取开始执行时间int result1、result2、result3、result4、result5; 矢量int large arrays; for(intI=1; i=100000000; I ) largeArrays.push_back(1; } int resultSum; getsumt(largearrays.begin )、largeArrays.end )、resultSum ); cout resultSum endl; end_time=clock (; //结束时间double Times=(double ) (end_time - start_time )/CLOCKS_PER_SEC; printf('%fsecondsn ',Times ); } 10000000036.100000 seconds多线程实现代码:

#包含iostream #包含向量

#include <algorithm>#include <thread>#include <numeric>#include <time.h>using namespace std;//线程要做的事情就写在这个线程函数中void GetSumT(vector<int>::iterator first, vector<int>::iterator last, int& result){ result = accumulate(first, last, 0); //调用C++标准库算法}int main() //主线程{ clock_t start_time, end_time; start_time = clock(); //获取开始执行时间 int result1, result2, result3, result4, result5; vector<int> largeArrays; for (int i = 1;i <= 100000000;i++) { largeArrays.push_back(1); } thread first(GetSumT, largeArrays.begin(), largeArrays.begin() + 20000000, std::ref(result1)); //子线程1 thread second(GetSumT, largeArrays.begin() + 20000000, largeArrays.begin() + 40000000, std::ref(result2)); //子线程2 thread third(GetSumT, largeArrays.begin() + 40000000, largeArrays.begin() + 60000000, std::ref(result3)); //子线程3 thread fouth(GetSumT, largeArrays.begin() + 60000000, largeArrays.begin() + 80000000, std::ref(result4)); //子线程4 thread fifth(GetSumT, largeArrays.begin() + 80000000, largeArrays.end(), std::ref(result5)); //子线程5 first.join(); //主线程要等待子线程执行完毕 second.join(); third.join(); fouth.join(); fifth.join(); int resultSum = result1 + result2 + result3 + result4 + result5; //汇总各个子线程的结果 cout << resultSum << endl; end_time = clock(); //获取结束时间 double Times = (double)(end_time - start_time) / CLOCKS_PER_SEC; printf("%f secondsn", Times);} 10000000031.296000 seconds

可以看出多线程实现效率大于一般实现。

四、问题

多线程效率的确较快,但对于上一个样例,在多线程中我们使用了5个线程来跑,按理说应该是五倍的效率,然而结果却不是这样,为什么呢?
以单核cpu为例,多线程的模型如下:
其多线程的实现方式是利用cpu空闲时间来跑其他线程的任务,但是在进入其他线程时就必须消耗时间来保存上一个线程和打开下一个线程,因此多线程并不是一定效率就比顺序执行效率高。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。