c++中多个线程使用同一个函数
我是小白,最近在学习实现一个简单的线程池,线程池中维护了一个存放线程的数组以及一个任务队列。在创建线程池(构造函数中)时创建若干个线程,起始时由于任务队列中没有任务,创建的每一个线程都处于阻塞状态。使用pthread_create函数创建线程时把所有的线程与同一个函数关联在一起,也就是产生如下的代码:
pthread_t p[5]; //线程池中有5个线程
for(int i = 0; i < 5; ++i)
{
pthread_create(&p[i], NULL, func, NULL);
}
看到这儿,我心里产生了一个疑问:可不可以将所有的线程都关联同一个回调函数func呢?
经过网上查阅相关资料,是可以这样做的,并且即使使用同一个函数这些函数之间也是互不影响的。每个进程都会有自己的虚拟地址空间,同一个进程中的每个线程都会在这个虚拟空间中,并被分配相应的资源。如果仅仅只使用函数内部的局部变量,这些线程之间是互不相关的,各执行各自的,不用使用互斥锁。如果不同的线程访问了全局变量那么要使用互斥锁,使得某一时刻只有一个线程操作该全局变量。
下面通过一个代码说明两个线程关联一个函数:
- #include <pthread.h>
- #include <iostream>
- using namespace std;
- void *print(void *arg)
- {
- for (int i = 0; i < 20; ++i)
- {
- cout << i << endl;
- }
- return NULL;
- }
- int main()
- {
- pthread_t p1, p2;
- pthread_create(&p1, NULL, print, NULL);
- pthread_create(&p2, NULL, print, NULL);
- pthread_join(p1, NULL);
- pthread_join(p2, NULL);
- return 0;
- }
从结果可以看出这两个线程都使用了print函数,它们各自执行各自的,不会因为使用了同一个函数而受到影响。
1.两个线程调用同一个函数
两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理(除非有非栈内存在捣乱,这种情况必须要有互斥锁)
2.两个不同进程中的两个线程调用同一个处理函数
c++中多个线程使用同一个函数相关推荐
- 两个线程调用同一个函数
函数本身只是代码,代码是只读的,无论多少个线程同时调都无所谓(因为只读嘛).但是函数里面总要用到数据, 如果数据属于线程(比如函数参数.局部变量,存在栈上,每个线程都有自己的栈),那么同时调还是没关系 ...
- linux多线程调用同一个函数解析
原文地址:http://blog.csdn.net/mq_ydn3102/article/details/8546722 问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底 ...
- linux子线程运行的函数_Linux中线程使用详解
4. 线程的属性 前面还说到过线程创建的时候是有属性的,这个属性由一个线程属性对象来描述.线程属性对象由pthread_attr_init()接口初始化,并由pthread_attr_destory( ...
- 【Linux 线程】同一个进程中的线程共享哪些资源
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线 ...
- windows系统中创建线程常用哪几个函数,有什么区别?
windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex. ...
- VC++中多线程学习(MFC多线程)一(线程的创建、线程函数如何调用类成员呢?如何调用主对话框的成员?、MFC中的工作线程和界面线程的区别)
这里废话不多讲了,因为项目原因,需要开启线程进行处理,在不了解线程的情况下,直接百度一下,然后就使用了,结果可想而知,出现了异常,所以花了一天时间系统学习一下多线程,这里主要是针对win32编程方面的 ...
- 在中断函数和MAIN函数中同时调用同一个函数的有趣现象
此处的信息适用于: C51所有版本 症状 我添加了一个中断处理程序(ISR)到我的项目中,然而我却得到了如下的警告: ***WARNING L15: MULTIPLE CALL TO SEGMENT ...
- 关于操作系统中进程、线程、死锁、同步、进程间通信(IPC)的超详细详解整理
作者主页:https://www.zhihu.com/people/san-hao-bai-du-ren-79 一.什么是进程?什么是线程? 1.1 进程定义 1.2 线程定义 1.3 ...
- c++ sleep函数_Linux 多线程应用中如何编写安全的信号处理函数
关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略.本文首先介绍如何编写安全的异步信号处理函数:然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同 ...
最新文章
- mysql 脑裂的问题,DRBD脑裂问题故障处理
- java 反序列化漏洞简介
- python日期函数引用_Python pandas.to_datetime函数方法的使用
- 小学生 python教程-小学生都在学python
- 高中生学python培养思维能力_基于培养思维能力的Python语言程序设计教学
- html中js添加或删除activex,JS:操作样式表2 :用JS实现添加和删除一个类名的功能(addClass()和removeClass())...
- Python学习:列表
- android弹幕开发,android弹幕框架
- 阿波罗配置中心(apollo)的个人看法
- java组合与继承始示例_排列组合:用公式示例解释的差异
- 企业级整站集群数据备份项目方案详解
- 什么叫做java程序中的继承_【Java】基础16:什么叫继承?
- 服务器不稳定补偿,《异化之地》服务器异常怎么解决 服务器不稳定官方补偿...
- 知乎十万级容器规模的Java分布式镜像仓库实践
- ENVI5.3安装教程(含软件下载)
- 多页面-HASH-页面间传值 Sloth-state
- Dubbo之手写RPC框架
- 新的GSMA报告强调“智联万物”在全球的作用
- GB/T28181-2022图像抓拍规范解读及技术实现
- directives 引用this
热门文章
- Android 真机连接本地PC服务器
- python图片截取斜四边形_python shapely.geometry.polygon任意两个四边形的IOU计算实例...
- win10系统多桌面切换方法及切换快捷键详细介绍
- 调用tel://打电话
- Selection dont contain a main type
- php yi ju hua,IT培训 后端开发 PHP等 PHP培训-
- “更新 TKK 失败,请检查网络连接” 解决方法
- 浅谈Java对接阿里IOT
- Excel 删除一行的快捷键
- js和css动态画出一只安卓机器人,附代码