linux c example about threads order

DBeaver Ultimate 25.3:国产数据库全栈开发与信创适配中枢 数据库客户端是数据工程师日常协作的基础工具,其核心价值在于统一SQL开发、元数据管理、跨源查询与执行分析等能力。随着信创推进和多源异构数据库普及,传统工具面临驱动冲突、中文支持薄弱、跨平台体验割裂等瓶颈。DBeaver Ultimate Edition凭借驱动沙箱隔离、分层元数据缓存、语义感知SQL编辑器及深度国产化适配(达梦、人大金仓、openGauss等),实现了从‘连接器’到‘数据库工作台’的演进。它不仅解决JDBC字符集协商、GB18030导出、ARM64 JNI兼容等工程细节问题,更通过CLI集成 阅读详情

原文地址:http://blog.youkuaiyun.com/harry_lyc/article/details/6055734

1:多线程设计通常是比较麻烦的,因为它牵涉到,线程间的同步、和执行顺序问题。在用户没有设定线程间的调度策略时,系统默认采取基于时间片轮转的调度策略。本实验是在默认的调度策略下,测试线程间的执行顺序问题。

本实验用的系统为Ubuntu10.04,Thread model: posix

gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

1.1 终端执行:$gcc -o main main.c -lpthread

2 执行代码

[cpp:firstline[1]] view plain copy print ?
  1. //main.c
  2. //example of thread order
  3. #include<stdio.h> 
  4. #include<pthread.h>  
  5. #include<stdlib.h>  
  6. #include<unistd.h>  
  7. #include<signal.h>  
  8. static void thread_one(char* msg);  
  9. static void thread_two(char* msg);  
  10. int  main(int argc, char** argv)  
  11. {  
  12.     pthread_t th_one,th_two;  
  13.     char * msg="thread";  
  14.     printf("thread_one starting/n");  
  15.     if(pthread_create(&th_one,NULL,(void*)&thread_one,msg)!=0)  
  16.     {  
  17.         exit(EXIT_FAILURE);  
  18.     }  
  19.     sleep(1);// @1  
  20.     printf("thread_two starting/n");  
  21.     if(pthread_create(&th_two,NULL,(void*)&thread_two,msg)!=0)  
  22.     {  
  23.         exit(EXIT_FAILURE);  
  24.     }  
  25.     printf("Main thread will sleep 1 S/n");  
  26.     sleep(1);//@2  
  27.     return 0;  
  28.       
  29. }  
  30. static void thread_one(char* msg)  
  31. {  
  32.     int i=0;  
  33.     while(i<6)  
  34.     {  
  35.         printf("I am one. loop %d/n",i);  
  36.         i++;  
  37.         //sleep(1);  
  38.     }  
  39. }  
  40. static void thread_two(char* msg)  
  41. {  
  42.     int i=0;  
  43.     while(i<6)  
  44.     {  
  45.         printf("I am two. loop %d/n",i);  
  46.         i++;  
  47.         //sleep(1);  
  48.     }  
  49. }  

2.1 主线程和子线程的执行顺序问题

2.1.1 主线程没有执行等待

在主线程没有执行等待的情况下,即@1和@2在注释掉的情况下。程序的运行如下。

thread_one starting

thread_two starting

Main thread will sleep 1 S

由此可见,多线程中子线程的执行是在主线程有空闲的条件下。即,如果主线程忙,或者是没有执行等待那么,子线程是不会执行的。

2.1.2 程序在@1中执行等待,@2中不等待

执行结果如下:

thread_one starting

I am one. loop 0

I am one. loop 1

I am one. loop 2

I am one. loop 3

I am one. loop 4

I am one. loop 5

thread_two starting

Main thread will sleep 1 S

程序在运行到I am one. loop 5时,停顿一下,再执行。

可见,主线程在@1处,停了1秒,等待线程1执行,在线程1执行完毕后,有时还有时间,主线程继续等待完1秒后,重新执行。

2.1.3 程序在@1中不执行等待,@2中等待

执行结果如下:

thread_one starting

thread_two starting

Main thread will sleep 1 S

I am one. loop 0

I am one. loop 1

I am one. loop 2

I am one. loop 3

I am one. loop 4

I am one. loop 5

I am two. loop 0

I am two. loop 1

I am two. loop 2

I am two. loop 3

I am two. loop 4

I am two. loop 5

可见,在两个子线程运行后,主线程等待了1秒,这是有充分的时间让子线程完成执行。两个现成的执行顺序为先后顺序。

2.1.4 程序在@1中执行等待,@2中等待

执行结果如下:

thread_one starting

I am one. loop 0

I am one. loop 1

I am one. loop 2

I am one. loop 3

I am one. loop 4

I am one. loop 5

thread_two starting

Main thread will sleep 1 S

I am two. loop 0

I am two. loop 1

I am two. loop 2

I am two. loop 3

I am two. loop 4

I am two. loop 5

程序在运行到I am one. loop 5时,停顿了一下。等待够1秒后继续执行。

在主线中,等待充分的时间使子线程执行,可以保证顺序执行。

2.1.5 @1,@2,@3,@4中个等待1秒。

程序执行结果如下:

thread_one starting

I am one. loop 0

thread_two starting

Main thread will sleep 1 S

I am one. loop 1

I am two. loop 0

在@1处,主线程等待了1S,让子线程1执行。子线程1执行一次循环,等待了1S。由于超过了主线程的等待时间,主线程在等待够1S后,继续执行。由于子线程1在子线程2显示输出时,被激活,所以子线程又循环一次后,子线程2输出结果。

2.1.6 @1,@3,@4中个等待1秒,@2中等待3秒

程序执行如下:

thread_one starting

I am one. loop 0

thread_two starting

Main thread will sleep 1 S

I am one. loop 1

I am two. loop 0

I am one. loop 2

I am two. loop 1

I am one. loop 3

I am two. loop 2

在主线程等待3秒时,由于线程1和线程2都已经执行。并且执行一次循环后,等待1秒。所以,运行的结果,时线程1和线程2交替运行。

 



Linux:线程优先级设置 同一优先级的多个线程中,一旦某个抢占式线程获取CPU,除非被更高优先级线程抢占(比如在非实时线程中创建一个更高优先级的实时线程),或该线程主动让出CPU资源,否则该线程将会一直占用CPU(但总会分配一点资源给SCHED_OTHER非实时线程)。另外,需要注意的是,只有具有足够权限的用户才能设置较高的实时线程优先级。,轮询式调度(实时线程),实时循环,设置优先级1-99,以循环方式运行,每个线程都有一个时间片来执行任务,时间片耗尽后,该线程将被放入队列的末尾,而较低优先级的线程有机会执行。 阅读详情

相关推荐

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1670

Linux C 多线程执行顺序问题

<br />1:多线程设计通常是比较麻烦的,因为它牵涉到,线程间的同步、和执行顺序问题。在用户没有设定线程间的调度策略时,系统默认采取基于时间片轮转的调度策略。本实验是在默认的调度策略下,测试线程间的执行顺序问题。<br />本实验用的系统为Ubuntu10.04,Thread model: posix<br />gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) <br /><br />2 执行代码<br />#include<stdio.h> #include<pthr

Harry的专栏 1万+

SAP特殊采购类80实战:跨工厂生产配置避坑指南(附完整测试流程)

本文深入解析SAP特殊采购类80在跨工厂生产场景下的实战应用与配置要点。文章从核心业务逻辑出发,详细拆解了后台配置、主数据与BOM的“双工厂”思维模式,并提供了从创建需求到成品收货的完整测试流程。重点揭示了多层BOM下的需求传递陷阱及常见报错解决方案,旨在帮助SAP顾问及用户规避实施风险,实现资源的灵活调度与流程自动化。

wind6的博客 1139

Linux线程(二)

首先对于CPU来说,内部的储存数据的寄存器只有一套,是时间片轮转执行每一个进程和线程的,对于执行的代码而言,首先需要将数据放到CPU上,然后CPU进行计算,计算完成之后,返回内存,完成整个的计算过程,如果在返回的途中,线程被轮换了,此时值还没有被写回内存,线程只有带着此时CPU内部寄存器的值(上下文的内容)在旁边等候,此时又进来一个线程,他就会对全局变量在次进行处理,当他处理了很多次之后,时间片轮转,又轮到上一个线程,他会带着他的上下文内容回来继续从断开的地方执行,此时就会导致全局变量的值出错。

super_haha_star的博客 252

流体动力学仿真软件:Star-CCM+_(1).Star-CCM+基础及入门

Star-CCM+的用户界面(UI)分为多个部分,包括菜单栏、工具栏、工作区、视图窗口和控制台。菜单栏包含文件、编辑、视图、工具等常用菜单。例如,“File”菜单可以用于打开、保存和退出项目。工具栏提供常用的工具按钮,如新建项目、打开项目、保存项目等。也可以自定义工具栏,添加常用的功能按钮。工作区显示当前项目的结构和各个对象。可以通过拖拽方式组织和管理项目中的各个部分。视图窗口显示几何模型、网格、结果等。可以通过不同的视图模式查看和分析数据。控制台显示软件的运行日志和输出信息。

kkchenjj的博客 1201

基于YOLOv11的手术器械计数系统:从数据集构建到Web应用部署

m2cai16-tool数据集:包含15种腹腔镜手术器械的标注图像Cholec80数据集:包含80个胆囊切除手术视频,标注了7种器械SurgicalTools数据集:包含超过10,000张手术器械图像,涵盖21类常见器械手术剪(Scissors)止血钳(Hemostat)持针器(Needle Holder)手术刀(Scalpel)镊子(Forceps)拉钩(Retractor)吸引器(Suction)

YOLO 396

linux 之线程(一)

学习笔记

x_201_x的博客 288

自动化测试与AI的结合应用

自动化测试,人工智能,机器学习,深度学习,测试用例生成,缺陷预测,测试优化 1. 背景介绍 在软件开发领域,自动化测试已成为不可或缺的一部分,它可以提高测试效率、降低测试成本,并确保软件质量。然而,传统的自动化测试方法往往依赖于人工编写的测试用例,这不仅耗时费力,而且难以应对复杂软件

AI架构师小马 2247

高并发之——线程的执行顺序

一、线程的执行顺序是不确定的 调用Thread的start()方法启动线程时,线程的执行顺序是不确定的。也就是说,在同一个方法中,连续创建多个线程后,调用线程的start()方法的顺序并不能决定线程的执行顺序。 例如,这里,看一个简单的示例程序,如下所示。 package io.binghe.concurrent.lab03; /** * @author binghe * @vers...

冰河的专栏 3917

基于YOLOv10的PCB电子元件智能识别系统设计与实现

数据预处理模块:负责对原始PCB图像进行标注、增强和格式转换模型训练模块:基于YOLOv10架构进行模型训练和优化推理检测模块:加载训练好的模型进行实时检测用户界面模块:提供友好的交互界面,方便用户操作和结果可视化YOLO(You Only Look Once)系列算法自2016年提出以来,经历了多次迭代更新。YOLOv1-v3:奠定了YOLO系列的基础架构YOLOv4-v7:引入大量优化技巧和网络结构改进YOLOv8-v9:进一步优化模型结构和训练策略YOLOv10。

YOLO 156

SAP_SD模块-销售批次策略应用记录

SAP_SD模块-销售批次策略完整案例

风沙的博客 2610

c主线程如何等待子线程结束 linux_Linux多线程(二)(线程等待,退出)

1.1. 等待线程退出线程从入口点函数自然返回,或者主动调用pthread_exit()函数,都可以让线程正常终止线程从入口点函数自然返回时,函数返回值可以被其它线程用pthread_join函数获取pthread_join原型为:#include int pthread_join(pthread_t th, void **thread_return);1. 该函数是一个阻塞函数,一直等到参数th...

weixin_30767365的博客 2983

Python爬虫教程:抓取地方政府网站的公开文件与政策信息

Web爬虫是指一种自动化脚本,用于模拟人类浏览器访问网页、提取网页内容的数据抓取工具。发送请求到目标网页;获取网页内容;解析网页内容,提取所需数据;将数据保存或进一步处理。爬虫可以抓取各种形式的数据,如文本、图片、文件等。本教程将重点展示如何抓取地方政府网站上公开的政策文件、公告等信息。许多政府网站都会采取一定的反爬虫措施,防止大量数据被爬取。IP封锁:如果短时间内大量请求来自同一IP,可能会被封锁。验证码:一些网站会使用验证码来验证访问者是否为机器人。动态加载。

2201_76125261的博客 1981

渗透测试 ( 3 ) --- Metasploit Framework (MSF)

Metasploit专业版和精简版的主要差别在于专业版上面集成了全自动攻击模块,通过远程API集成网络分割测试模块、标准基线审计向导模块、闭环漏洞验证优先处理功能、动态载荷规避防病毒解决方案、钓鱼意识管理和鱼叉式网络钓鱼模块、对OWASP Top 10漏洞的Web应用程序测试模块、高级命令行和Web界面的选择模块。但是,专业版是必须要付费的,所以除非用到非个人的功能,否则没有必要去使用专业版,而且,专业版和精简版的渗透攻击模块是一样的。.........

freeking101的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java Thread Pools — Deep Dive

Java线程池核心原理摘要 线程池作用:解决线程创建开销大、资源耗尽问题,通过复用固定线程、控制并发量、任务队列解耦任务提交与执行。Java提供Executor框架(Java 5+)实现。 核心类层次: Executor → ExecutorService → ThreadPoolExecutor(核心)/ScheduledThreadPoolExecutor(定时) ForkJoinPool:工作窃取,支持并行流和CompletableFuture ThreadPoolExecutor关键参数: core

quwenqian的专栏 389

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Apache HTTP Server 从零安装到生产环境配置实战指南

Web服务器是承载网站和网络应用的基础软件,负责处理HTTP请求并返回响应。其工作原理是通过监听网络端口,接收客户端请求,并根据配置的规则将请求映射到服务器上的资源或后端应用。作为互联网基础设施的核心组件,Web服务器的稳定性和性能直接影响在线服务的可用性与用户体验。Apache HTTP Server凭借其成熟稳定、功能全面和模块化架构,在众多企业级应用、内容管理系统(如经典的LAMP栈)和内部管理后台中依然是可靠的选择。本文将从包管理器与源码编译两种安装方式切入,详细解析httpd.conf主配置文件、

weixin_30325971的博客 390

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

CPU 缓存 | 原理、映射、一致性

……

u013669912的博客 410

MYSQL 网络连接

assert(mp!= nullptr);#endif首先断言mp非空。为结构体动态分配内存,并将指针赋给。调用来初始化这个安全互斥锁,同时传入源文件名和行号。内部通常会:再调用初始化真正的原生互斥体。记录锁的创建位置、线程 ID 等信息,以便在死锁检测、锁定顺序检查或错误报告时提供调试信息。这种模式主要用于调试版本,帮助开发者发现互斥锁使用问题(如重复锁定、死锁、未释放等)。#else#endif直接调用初始化中的原生互斥体(例如或 Windows 的。

Piemon&Anokata的博客 497

4.Linux C多线程的执行顺序问题

先来探究一下最自然状态下(除了pthread_create()不做任何处理)main线程、子线程之间的执行顺序问题! 试验之前不妨来些猜测: 猜测1:执行顺序main Thread > thread_one > thread_two(thread_one比thread_two先创建) 猜测2:它们的执行顺序没有严格的先后顺序 P.S:若猜测1正确,那么在“不对主线程进行阻塞”的情况下,子线

风流的苦行僧 2245

linux中c语言代码线程执行顺序问题

先来看这样一段代码 /* pthread_create函数 原型:int pthread_create((pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) 用法:#include <pthread.h> 功能:创建线程(实际上就是确...

guozuofeng的博客 4258

有关线程的知识!

线程的创建 #include int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); 参数说明: thread:指向pthread_t类型的指针,用于引用新创建的线程。 attr:用于设置线程的属性,一般不需要特殊的属性,所以可以简单地

BestYyao的博客 483

linux seqlock & rcu 浅析

转自http://hi.baidu.com/_kouu/item/0b99dae513c2b4b52f140bd1 在linux内核中,有很多同步机制。比较经典的有spin_lock(忙等待的锁)、mutex(互斥锁)、semaphore(信号量)、等。并且它们几乎都有对应的rw_XXX(读写锁),以便在能够区分读与写的情况下,让读操作相互不互斥(读写、写写依然互斥)。 而seqlock和rc

nevil的专栏 1148

Linux下 线程优先级 和 线程调度策略 设置

参考连接:https://blog.youkuaiyun.com/weixin_44845857/article/details/118409858。

only_tian的博客 4360

【Linux】多线程

在一个程序里的一个执行路线就叫做线程(thread)。线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。需要明确的是,一个进程的创建实际上伴随着其进程控制块(task_struct)、进程地址空间(mm_struct)以及页表的创建,虚拟地址和物理地址。

m0_70088010的博客 1319

主线程和子线程执行顺序问题

public class MyThread implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()); } } public class Main { public s...

dijiao3537553的博客 868

linux 线程优先级设置

linux 线程 优先级

pizziars的专栏 2630
上一篇: Linux终端模式下查看电脑的硬件配置信息小技巧
下一篇: linux /dev 常见特殊设备介绍与应用[loop,null,zero,full,random]
July_Yang
博客等级 码龄15年 46粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值