线程编程之浅尝辄止1

Windows C++多线程编程实战:从API原理到线程池实现 多线程编程是现代软件开发中提升程序性能与响应能力的关键技术,尤其在Windows平台上,理解其底层原理对于构建高性能应用至关重要。Windows API提供了内核级线程管理能力,通过CreateThread等系统调用直接与操作系统交互,相比C++标准库的std::thread,它提供了更精细的线程控制、丰富的同步原语(如事件、互斥体、信号量)以及处理器亲和性等高级特性。这些技术价值在于能够实现极致的性能优化和与Windows生态的深度集成,广泛应用于桌面应用、游戏开发、后台服务等需要高并发处理的场景。本文聚 阅读详情

学习线程是一件很好玩的是,它不像进程那样复杂而且很好用。下面是我写的一段代码,附有一定的解释和说明,以及一些思考,看懂了我这段代码和注释,那么线程编程就入门了,合适新手研究。不对的地方请多多指教啊。

代码由A、B、C、D、E、EE六个线程,其功能有,主线程传参(结构体、整形、字符串)、子线程返回参数的两种方法、创建双层线程(父子孙,不建议这样做)以及他们之间的参数传递与计算等,好好研究吧。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

struct menber
{
    int a;
    char *s;
};

struct fo
{
	int a,b,c,d;
}foo={1,2,3,4};
void printfoo(const char *s,const struct fo *fp)
{
	printf("%s",s);
	printf("foo.a=%d\n",fp->a);
	printf("foo.b=%d\n",fp->b);
	printf("foo.c=%d\n",fp->c);
	printf("foo.d=%d\n",fp->d);
}
void *thr_D(void *arg)//子线程传给父线程一个结构体
{
	printfoo("我是线程D:\n",&foo);
	pthread_exit((void *)&foo);//这个地方的&引用一定不要丢,丢了,编译通过但运行出现段错误

}

void *thr_C(void *arg)//传递字符串
{
   char *name=(int *)arg; //-Wall编译时出现警告:从不兼容的指针尅想初始化
//   sleep(1);
   printf("我是线程C,ID = %u,得到的字符串name=%s\n",(unsigned int)pthread_self(),name);
   return (void *)0;
}
void *thr_B(void *arg)//传递整形
{
    int *m =(int *)arg; 
    printf("我是线程B,ID = %u,得到的整形m=%u\n",(unsigned int)pthread_self(),*m);
    return (void *)0;
}
void *thr_A(void *arg)//传递结构体
{
    struct menber *temp;
	temp=(struct menber *)arg;
    printf("我是线程A,ID = %u,我从进程得到strut:",(unsigned int)pthread_self());
    printf("menber->a = %d ; ",temp->a);
    printf("menber->s = %s  \n",temp->s);
    return (void *)0;
}
void *thr_EE(void *arg)//父子间互相通信
{
    int c;
    int *b=(void *)arg;
	printf("我是sun线程,");
	printf("请输入一个数:");
	scanf("%d",&c);//在%d后面不能加\n,不然执行到这句后,就不在执行了    
    c=c*(*b);		 
	printf("  经过计算*参数值得到c = %d\n",c);
    return (void *)c;
//这是线程与进程之间互相传至的程序,在线程中可以使用return 和
//pthread_exit,返回值到进程,效果是一样
}

void *thr_E(void *arg)//父子间互相通信
{
	pthread_t EE;
    int *aa=(int *)arg;
	int x =1;
	int *atr = &x;
	int *y;
	printf("我是zi线程,我得到了父线程的参数:%d\n",*aa);
	x=x+ (*aa);
	printf("  经过我的计算加1得出:%d\n",x);
	pthread_create(&EE, NULL, thr_EE,(void *)atr);
	pthread_join(EE,(void *)&y);
	printf("zi经过孙线程计算得到:%d\n",y);
	pthread_exit((void *)y);
}

int main(int argc,char *argv[])
{
    pthread_t A,B,C,D,E;
	int a,*count;
	int *atr=&a;

	
	int error;
	struct menber *b;
	struct fo *fp;
	int m =1;
    int *attr=&m;
	char *name ="My name is BHW!";
	b=(struct menber *)malloc( sizeof(struct menber) );
    b->a = 4;
    b->s = "我是hubbybob";
//3个思考题:
//1:3个join分别在creat函数下,会是什么结果?
//2:把3个join放到所有creat后面,回事什么结果?
//3:把3个join去掉,回事什么结果?
    error = pthread_create(&C, NULL, thr_C, (void *)name);
    error = pthread_create(&B, NULL, thr_B, (void *)attr);//如果传入的参数为多个,必须以结构体的形式传入
    error = pthread_create(&A, NULL, thr_A, (void *)b);
    //pthread_join(C, NULL);
  //  pthread_join(B, NULL);
//    pthread_join(A, NULL);
//答案:
//1:打印的结果是A-B-C的顺序,但是其线程的ID是一样的
//2:不管ABC的join的顺序如何,打印的结果只与creat的顺序,先执行最后一个,而且线程ID不一样,增大,为什么?
//3:去掉join后打印的顺序为CBA,打印顺序与creat的顺序有关,先执行最后一个,且线程ID不一样,增大,为什么?
//线程创建时不保证哪个线程先运行,其所有的现象调试都可用sleep,来调试,效果是很明显的,大家可以试一试
//并且可以通过sleep来调节他们的占空比
    sleep(1);
    printf("下面是由线程传给进程的参数:\n");
    error = pthread_create(&D, NULL, thr_D, NULL);
    pthread_join(D,(void *)&fp );
//这里的&引用符号不能少,少了后,编译通过,但运行发生段错误
//放生段错误,修改正确之后,再次编译会打印这样一条消息
//"You have new mail in /var/spool/mail/root"这是怎么回事呢?
	sleep(1);
	printfoo("我是D传回的:\n",fp);
    sleep(1);
	printf("下面在线程中创建一个线程,但是不推荐使用:\n");
//这是个很简单的多线程测试程序,在主线程中创建线程E ,在E 中创建EE ,
//其功能是实现 count=(x+1)*y,x有主线程输入,y有孙线程输入
//但是这是比较麻烦的,因为猪线程传值给E,E再传给EE,返回时EE返回给E,E再返回给主线程,
//有没有办法直接由EE返回值给主线程???
     printf("我是父线程,请输入主参数a:");
	 scanf("%d",&a); 
	 error = pthread_create(&E, NULL, thr_E,(void *)atr);
	 pthread_join(E,(void *)&count);
     printf("  经过zi与孙的计算得到count=%d\n",count);//-Wall选项编译时出现警告:%d为int,而参数为int *
	 sleep(2);
	return 0;
}

这段代码的结果:


另一段代码的研究:其结果就不附图了,感兴趣的话,可以用sleep函数来控制,亲自体验一下。

//这是一个很有意思的程序,其输出的顺序是可以改变的:
//1.当加上pthread_join()这个函数时,其顺序是先执行线程的内容,进程阻塞赛直至线程结束,但也与此函数的位置有关
//2.当不加pthread_join()这个函数时,其顺序可由sleep()函数控制
//3.当进程中的sleep去掉后则只能看到进程的内容被打印,是因为没有阻塞时,直接执行了return,结束了进程
//4.sleep可以控制线程与进程的占空比

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
void *thread(void *str)
{
    int i;
    for (i = 0; i < 6; ++i)
    {
       sleep(3);
        printf( "This in the thread : %d\n" , i );
    }
    return NULL;
}

int main()
{
    pthread_t pth;
    int i;
    int ret = pthread_create(&pth, NULL, thread, (void *)(i));
    
   // pthread_join(pth, NULL);
    printf("123\n");
    for (i = 0; i < 4; ++i)
    {
        sleep(1);
        printf( "This in the main : %d\n" , i );
    }
    pthread_join(pth, NULL);
    return 0;
}




        
GradNorm:Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks,梯度归一化 文章目录引言gradnorm   gradnorm论文地址:https://arxiv.org/abs/1711.02257   gradnorm是一种优化方法,在多任务学习(Multi-Task Learning)中,解决 1. 不同任务loss梯度的量级(magnitude)不同,造成有的task在梯度反向传播中占主导地位,模型过分学习该任务而忽视其它任务;2. 不同任务收敛速度不一致;这两个... 阅读详情

相关推荐

LAMMPS实操系列(四): 高熵合金FCC-CoCrCuFeNi的退火模拟

我们对FCC-CoCrCuFeNi的退火模拟思路主要是,首先将材料以均匀的速率用100 ps从300 K升温至1000 K,然后在1000 K的温度下平衡100 ps,随后以均匀的速率用100 ps从1000 K降温至300 K,随后通过共轭梯度下降法做静力学结构优化得到退火后的结构。由于FCC-CoCrCuFeNi高熵合金被认为是潜在的工程结构材料[1],接下来我们将对退火前后的结构进行压缩模拟,对比退火前后FCC-CoCrCuFeNi高熵合金的力学性能变化,敬请各位读者关注我们的更新。

Ceshigo_CD的博客 4838

【多线程编程学习笔记1】进程、线程概念_一个进程可以包含多个线程,各线程(

所谓多线程,即一个进程中拥有多(≥2)个线程,线程之间相互协作、共同执行一个应用程序。我们通常将以“多线程”方式编写的程序称为“多线程程序”,将编写多线程程序的过程称为“多线程编程”,将拥有多个线程的进程称为“多线程进程”。当进程中仅包含 1 个执行程序指令的线程时,该线程又称“主线程”,这样的进程称为“单线程进程”。如今,很多应用程序(软件)都是多线程程序,例如 QQ 具备同时和多人聊天的能力、迅雷具备同时下载多个资源的能力、很多杀毒软件可以同时开启杀毒、清理垃圾、电脑加速等功能。

2401_84931693的博客 512

20 CVPR Learning 3D Semantic Scene Graphs From 3D Indoor Reconstructions 学习笔记

3RScan是大规模真实世界的室内场景,特点是对478个自然改变的室内环境在不同的时间帧进行了1482 RGB-D scans,每一个scene都包括了一些位置被改变的物体。它和ScanNet数据集的区别主要在于ScanNet中的每一个采样环境都不相同,但是3RScan中存在采样环境相同但物体的位置不同的场景。Scene Graph Annotations 则是在3RScan的基础上给物体加入了场景图需要的关系、物体特征和类别标注,同时对3RScan进行了扩展,以此形成了场景图数据。

weixin_43508459的博客 1838

【多线程编程学习笔记5】获取线程函数的返回值 pthread_join() 函数_pthread_join返回值

在程序的在主线程(main() 函数)中,我们尝试两次调用 pthread_join() 函数获取 myThread 线程执行结束的返回值。再次强调,一个线程执行结束的返回值只能由一个 pthread_join() 函数获取,当有多个线程调用 pthread_join() 函数获取同一个线程的执行结果时,哪个线程最先执行 pthread_join() 函数,执行结果就由那个线程获得,其它线程的 pthread_join() 函数都将执行失败。//输出获取到的 myThread 线程的返回值。

2401_84265548的博客 2229

海康威视SADP SDK实战:5分钟搞定局域网设备搜索(附C++代码示例)

本文详细解析了海康威视SADP SDK在局域网设备搜索中的高效应用,通过C++代码示例展示如何快速实现设备发现与信息获取。SADP协议支持全面设备信息采集和实时状态更新,适用于智能安防和物联网管理场景,帮助开发者5分钟内完成设备搜索功能集成。

rum55的博客 877

华为OD机试真题目录汇总(Java语言)2024 B+C+D+E卷 (560道)

本文是2023华为OD机试真题(Java 语言) B卷专栏的目录贴(定期更新2023华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Java语言进行更新解答,包含真题,思路分析,代码参考,每个题目的思路分析都非常详细,超过百字欢迎大家订阅学习,代码可以直接运行使用,全网限时最低价,持续更新)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。

KJ.JK 8万+

2024年Go最新【多线程编程学习笔记10】使用条件变量实现线程同步(2),Golang面试常用算法

申明:本学习笔记是在该教程的基础上结合自己的学习情况进行的总结,不是原创,想要看原版的请看C语言中文网的,该网站有很多好的编程学习教程,尤其是关于C语言的。

2401_84905102的博客 773

Dify智能体开发:发布嵌入网站

Dify 支持将你的 AI 应用嵌入到业务网站中,你可以使用该能力在几分钟内制作具有业务数据的官网 AI 客服、业务知识问答等应用。点击 WebApp 卡片上的嵌入按钮,复制嵌入代码,粘贴到你网站的目标位置。

王国平的博客 3246

深入解析Java多线程与并发编程(一)(多线程以及线程创建的四种方法)

本期博客深入探讨了Java并发编程中的多线程与线程创建。首先,介绍了进程与线程的基本概念,指出进程是程序的一次执行,包含程序段、数据段和进程控制块,而线程是CPU调度的最小单位,共享进程的内存空间和系统资源。接着,详细对比了进程与线程的区别,强调线程的上下文切换速度更快,且线程之间共享资源。在创建线程方面,介绍了三种主要方法:继承Thread类、实现Runnable接口以及使用Callable和FutureTask。继承Thread类需要重写run方法,而实现Runnable接口则通过Thread类创建线程

wxchyy的博客 1318

数字人(对嘴型 Lip-sync)数据集 LRS2 介绍(含网盘链接)

LRS2(Lip Reading Sentences 2)是牛津大学与BBC合作开发的一个大规模唇语识别数据集,专门用于训练和评估数字人唇语同步(Lip-sync)技术。该数据集包含数千条来自BBC电视节目的口语句子,每个句子长度最多100个字符。官方网站为:https://www.robots.ox.ac.uk/~vgg/data/lip_reading/lrs2.html可惜需要认证,不过我已经下载好并存到网盘里了,有需要可适用如下链接下载。(仅供学习,请勿传播)

iioSnail的博客 1687

【实战篇导读】四足机器人运动控制导读

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对四足机器人运动运动控制系统及相关算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章主要介绍了波士顿spot机器人的发展历史、四足机器人的硬件系统及电机执行器组成包括硬件系统、关节电机执行器,机载传感器机处理器及电气连接等。概述了四足机器人规划控制、感知、定位及局部地图的相关算法方向。

qq_35635374的博客 679

2024年最全多线程学习笔记1,面试技巧的书籍

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~给大家准备的学习资料包括但不限于:Python 环境、pycharm编辑器/永久激活/翻译插件python 零基础视频教程Python 界面开发实战教程Python 爬虫实战教程Python 数据分析实战教程python 游戏开发实战教程Python 电子书100本。

2401_84138927的博客 606

S7-200 SMART PLC 子程序功能块(阀门控制)

由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 8071

Python多线程编程:概念、技巧及最佳实践_python 实现多线程最佳实践

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~给大家准备的学习资料包括但不限于:Python 环境、pycharm编辑器/永久激活/翻译插件python 零基础视频教程Python 界面开发实战教程Python 爬虫实战教程Python 数据分析实战教程python 游戏开发实战教程Python 电子书100本。

m0_60707708的博客 642

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【多线程编程学习笔记12】如何避免线程发生死锁?_如何在多线程中避免发生死(1)

程序中共创建了 4 个线程,它们都执行 thread_func() 函数,该函数内完成了对互斥锁的“加锁”操作,但没有调用 pthread_mutex_unlock() 函数对互斥锁“解锁”。通过程序的执行结果可以看到,4 个线程中仅有 1 个线程成功执行结束,其它 3 个线程一直处于等待互斥锁“解锁”的阻塞状态,发生了死锁。线程 3135751936 创建完成。线程 3125262080 创建完成。线程 3114772224 创建完成。线程 3135751936 执行完成。

2401_84931491的博客 455

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【螺丝少年编程路】操作系统底层的浅尝辄止

????作者简介:大家好,我是 爪哇小白2021。 半路出家的程序员,在从事开发之前在 某省测绘院 玩了一年的飞机,机缘巧合之下发现了更有趣的事情,虽然是个菜鸟但仍然热爱生活…之前喜欢用摄影记录生活,现在改用文字记录啦~ ps:同时也是一个不太正经的航拍选手! ???? 总结:记录自己的学习历程,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 ???? ✉️ 在青年时期,人有虚荣心和野心是很正常的。成熟的标志是自我认识,认清了自己的天赋方向,于是外在的虚荣心和野心被内在的目标取代。 1. 冯诺

风归去. 367

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【多线程编程学习笔记1】进程、线程概念_一个进程可以包含多个线程,各线程((1)

我们知道,一个进程指的是一个正在执行的应用程序。线程对应的英文名称为“thread”,它的功能是执行应用程序中的某个具体任务,比如一段程序、一个函数等。线程和进程之间的关系,类似于工厂和工人之间的关系,进程好比是工厂,线程就如同工厂中的工人。一个工厂可以容纳多个工人,工厂负责为所有工人提供必要的资源(电力、产品原料、食堂、厕所等),所有工人共享这些资源,每个工人负责完成一项具体的任务,他们相互配合,共同保证整个工厂的平稳运行。

2401_84931568的博客 446

【多线程编程学习笔记1】进程、线程概念_一个进程可以包含多个线程,各线程((2)

我们知道,一个进程指的是一个正在执行的应用程序。线程对应的英文名称为“thread”,它的功能是执行应用程序中的某个具体任务,比如一段程序、一个函数等。线程和进程之间的关系,类似于工厂和工人之间的关系,进程好比是工厂,线程就如同工厂中的工人。一个工厂可以容纳多个工人,工厂负责为所有工人提供必要的资源(电力、产品原料、食堂、厕所等),所有工人共享这些资源,每个工人负责完成一项具体的任务,他们相互配合,共同保证整个工厂的平稳运行。

2401_84931568的博客 547

Java多线程——wait和notify方法作用,线程的状态(1)

线程过多会带来额外的开销,频繁创建和销毁大量线程需要占用系统资源,消耗大量时间。其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。

2401_84562768的博客 1098

2024年Python多线程与多线程中join()的用法(1)

def run():print('当前线程的名字是: ', threading.current_thread().name)if== ‘’:print(‘这是主线程:’, threading.current_thread().name)t.start()print(‘主线程结束!print(‘一共用时:’, time.time()-start_time)其执行结果如下关键点:我们的计时是对主线程计时,主线程结束,计时随之结束,打印出主线程的用时。

2401_84563933的博客 524

10年开发大佬,用300案例,附学习路线,详解多线程编程核心技术(1)

在学习并发时,Lock是synchronized关键字的进阶,掌握Lock有助于学习并发包中源代码的实现原理,在并发包中大量的类使用了Lock接口作为同步的处理方式。学习完多线程同步后就可以有效控制线程间处理数据的顺序性,及对处理后的数据进行有效值的保证,更好地对线程执行结果有正确的预期。经过本章的学习,可以将以前分散的线程对象进行彼此的通信与协作,线程任务不再是单打独斗,更具有团结性,因为它们之间可以互相通信,就像命令官与执行者一样。对任务的计划规划更加合理,不再是随机的和盲目的了。

2401_86790428的博客 1619

【多线程编程学习笔记2】分别在linux环境下和Windows环境下写出我们的第一个多线程程序_-lpthread 在windows中的写法(1)

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

m0_60388261的博客 958

网络安全最新jstack分析多线程死锁,来吧_jstack deadlock(1),2024年最新2024年网络安全网络编程总结篇

" | 进入了" + this.getClass().getSimpleName() + " 获取到资源 | 准备调用:"+ " | 进入了" + this.getClass().getSimpleName() + " 获取到资源 | 准备调用:"System.out.println(“当前线程:” + Thread.currentThread().getName()System.out.println(“当前线程:” + Thread.currentThread().getName()

2401_84264662的博客 707

Java多线程面试题,我丝毫不慌(1)

正确使用多线程能够提高我们应用程序的效率,同时给我们会带来非常多的问题,这些都是我们在使用多线程之前需要注意的地方。无论是不变性、可见性、原子性、线程封闭、委托这些都是实现线程安全的一种手段。要合理地使用这些手段,我们的程序才可以更加健壮!Lock显式锁是JDK1.5之后才有的,之前我们都是使用Synchronized锁来使线程安全的~Lock显式锁是一个接口,我们来看看:随便翻译一下他的顶部注释,看看是干嘛用的:可以简单概括Lock方式来获取锁支持中断、超时不获取、是非阻塞的提高了语义化。

2401_84239625的博客 780

github上使用git clone下载所有链接到的子模块

例如:git clone https://github.com/irtimmer/moonlight-embedded.git 在这个github上的根目录下有个third_party目录,此目录下链接了其他的github目录,因此只执行上面那条语句或者download zip下载好后 此目录下是空的, 此时如果已经下载好了这个gitbub,进入到其根目录下面: cd ...

hubbybob1专栏 1万+
上一篇: fork与vfork浅析
下一篇: Opencv学习笔记(六)SURF学习笔记
葫芦娃二娃
博客等级 码龄15年 1850粉丝 69原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值