Linux--线程编程

Linux系统编程——线程 Linux系统编程——线程1. 线程1.1 什么是线程1.2 Linux内核线程实现原理1.3 线程共享资源与非共享资源1.4 线程优、缺点2. 线程控制原语(重点)2.1 pthread_self函数2.2 pthread_create函数2.3 pthread_exit函数2.4 pthread_join函数2.5 pthread_detach函数2.6 pthread_cancel函数2.7 pthread_equal函数2.8 控制原语对比3. 线程属性(了解)3.1 线程属性初始化3.2 线程的分 阅读详情
原文:http://www.cnblogs.com/forstudy/archive/2012/04/05/2433853.html
进程
  系统中程序执行和资源分配的基本单位
  每个进程有自己的数据段、代码段和堆栈段
  在进行切换时需要有比较复杂的上下文切换
 
线程
  减少处理机的空转时间,支持多处理器以及减少上下文切换开销, 比创建进程小很多
  进程内独立的一条运行路线
  处理器调度的最小单元,也称为轻量级进程

可以对进程的内存空间和资源进行访问,并与同一进程中的其他线程共享

 

线程
  线程相关的执行状态和存储变量放在线程控制表内
  一个进程可以有多个线程,有多个线程控制表及堆栈寄存器,共享一个用户地址空间
 
多线程同步问题
  线程共享进程的资源和地址空间
  任何线程对系统资源的操作都会给其他线程带来影响
 

 
线程技术发展
  Linux 2.2内核
    •不存在真正意义上的线程
  Linux 2 .4内核
    •消除线程个数的限制,允许动态地调整进程数上限
  在Linux 内核2.6之前,进程是最主要的处理调度单元,并没支持内核线程机制
  Linux 2.6内核
    •实现共享地址空间的进程机制, 在1996年第一次获得线程的支持
 
线程技术发展
  为了改善LinuxThread问题,根据新内核机制重新编写线程库, 改善Linux对线程的支持
    •由IBM主导的新一代POSIX线程库(Next Generation POSIX Threads,简称为NGPT)
      –NGPT项目在2002年启动
      –为了避免出现有多个Linux线程标准,在2003年停止该项目
    •由Red Hat主导的本地化POSIX线程库 (Native POSIX Thread Library,简称为NTPL)
      –最早在Red Hat Linux9中被支持
      –现在已经成为GNU C函数库的一部分,同时也成为Linux线程的标准
 
 
 
线程标识
  线程ID
    •进程ID在整个系统中是唯一的
    •线程ID只在它所属的进程环境中有效
函数: pthread_self()

线程标识
  pthread_t类型通常用结构来表示
  •不能把它作为整数处理
    –Linux使用无符号长整数表示
  •为了移植,使用函数来比较线程ID
函数: pthread_equal()

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 
 5 int main(){
 6     pthread_t thread_id;
 7 
 8     thread_id=pthread_self(); // 返回调用线程的线程ID
 9     printf("Thread ID: %lu.\n",thread_id);
10 
11     if (pthread_equal(thread_id,pthread_self())) {
12 //    if (thread_id==0) {
13         printf("Equal!\n");
14     } else {
15         printf("Not equal!\n");
16     }
17     return 0;
18 }
复制代码

 

 

线程编程
  操作用户空间中的线程
 
创建线程
  •调用该线程函数的入口点
  •使用函数pthread_create(),线程创建后,就开始运行相关的线程函数
复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 
 5 void *thrd_func(void *arg);
 6 pthread_t tid;
 7 
 8 int main(){
 9     // 创建线程tid,且线程函数由thrd_func指向,是thrd_func的入口点,即马上执行此线程函数
10     if (pthread_create(&tid,NULL,thrd_func,NULL)!=0) {
11         printf("Create thread error!\n");
12         exit(1);
13     }
14 
15     printf("TID in pthread_create function: %u.\n",tid);
16     printf("Main process: PID: %d,TID: %u.\n",getpid(),pthread_self()); 
17     
18     sleep(1); //race
19 
20     return 0;
21 }
22 
23 void *thrd_func(void *arg){
24 //    printf("I am new thread!\n");
25     printf("New process:  PID: %d,TID: %u.\n",getpid(),pthread_self()); //why pthread_self
26     printf("New process:  PID: %d,TID: %u.\n",getpid(),tid); //why pthread_self
27 
28     pthread_exit(NULL); //退出线程
29 //    return ((void *)0);
30 }
复制代码

 
退出线程
  •在线程函数运行完后,该线程也就退出了
  •或使用函数pthread_exit(),这是线程的主动行为
  •不能使用exit()

使调用进程终止,所有线程都终止了

等待线程

  •由于一个进程中的多个线程是共享数据段的,通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放

  •pthread_join()函数

    类似进程的wait()/waitpid()函数,用于将当前线程挂起来等待线程的结束
    是一个线程阻塞的函数,调用它的线程一直等待到被等待的线程结束为止
    函数返回时,被等待线程的资源就被收回

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 
 5 void *thrd_func1(void *arg);
 6 void *thrd_func2(void *arg);
 7 
 8 int main(){
 9     pthread_t tid1,tid2;
10     void *tret;
11     // 创建线程tid1,线程函数thrd_func1
12     if (pthread_create(&tid1,NULL,thrd_func1,NULL)!=0) {
13         printf("Create thread 1 error!\n");
14         exit(1);
15     }
16     // 创建线程tid2,线程函数thrd_func2
17     if (pthread_create(&tid2,NULL,thrd_func2,NULL)!=0) {
18         printf("Create thread 2 error!\n");
19         exit(1);
20     }
21     // 等待线程tid1结束,线程函数返回值放在tret中
22     if (pthread_join(tid1,&tret)!=0){
23         printf("Join thread 1 error!\n");
24         exit(1);
25     }
26 
27     printf("Thread 1 exit code: %d.\n",(int *)tret);
28     // 等待tid2结束,线程函数返回值放在tret中
29     if (pthread_join(tid2,&tret)!=0){
30         printf("Join thread 2 error!\n");
31         exit(1);
32     }
33 
34     printf("Thread 2 exit code: %d.\n",(int *)tret);
35 
36     return 0;
37 }
38 
39 void *thrd_func1(void *arg){
40     printf("Thread 1 returning!\n");
41 //    sleep(3);
42     return ((void *)1); // 自动退出线程
43 }
44 
45 void *thrd_func2(void *arg){
46     printf("Thread 2 exiting!\n");
47     pthread_exit((void *)2);  // 线程主动退出,返回(void *)2
48 }
复制代码



取消线程

  •在别的线程中要终止另一个线程
  •pthread_cancel()函数
  •被取消的线程可以设置自己的取消状态
    –被取消的线程接收到另一个线程的取消请求之后,是接受还是忽略这个请求
    –如果接受,是立刻进行终止操作还是等待某个函数的调用等

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 
 5 void *thrd_func1(void *arg);
 6 void *thrd_func2(void *arg);
 7 
 8 pthread_t tid1,tid2;
 9 
10 int main(){
11     // 创建线程tid1,线程函数thrd_func1
12     if (pthread_create(&tid1,NULL,thrd_func1,NULL)!=0) {
13         printf("Create thread 1 error!\n");
14         exit(1);
15     }
16     // 创建线程tid2,线程函数thrd_func2
17     if (pthread_create(&tid2,NULL,thrd_func2,NULL)!=0) {
18         printf("Create thread 2 error!\n");
19         exit(1);
20     }
21     // 等待线程tid1退出
22     if (pthread_join(tid1,NULL)!=0){
23         printf("Join thread 1 error!\n");
24         exit(1);
25     }else
26         printf("Thread 1 Joined!\n");
27     // 等待线程tid2退出
28     if (pthread_join(tid2,NULL)!=0){
29         printf("Join thread 2 error!\n");
30         exit(1);
31     }else
32         printf("Thread 2 Joined!\n");
33 
34     return 0;
35 }
36 
37 void *thrd_func1(void *arg){
38 //    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
39     pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); // 设置其他线程可以cancel掉此线程
40 
41     while(1) {
42         printf("Thread 1 is running!\n");
43         sleep(1);
44     }
45     pthread_exit((void *)0);
46 }
47 
48 void *thrd_func2(void *arg){
49     printf("Thread 2 is running!\n");
50     sleep(5);
51     if (pthread_cancel(tid1)==0)  // 线程tid2向线程tid1发送cancel
52         printf("Send Cancel cmd to Thread 1.\n");
53         
54     pthread_exit((void *)0);
55 }
复制代码

 

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 
 5 #define THREAD_NUM 3
 6 #define REPEAT_TIMES 5
 7 #define DELAY 4
 8 
 9 void *thrd_func(void *arg);
10 
11 int main(){
12     pthread_t thread[THREAD_NUM];
13     int no;
14     void *tret;
15     
16     srand((int)time(0)); // 初始化随机函数发生器 
17 
18     for(no=0;no<THREAD_NUM;no++){
19         if (pthread_create(&thread[no],NULL,thrd_func,(void*)no)!=0) { // 创建THREAD_NUM个线程,传入(void*)no作为thrd_func的参数
20             printf("Create thread %d error!\n",no);
21             exit(1);
22         } else
23             printf("Create thread %d success!\n",no);
24     }
25 
26     for(no=0;no<THREAD_NUM;no++){
27         if (pthread_join(thread[no],&tret)!=0){ // 等待thread[no]线程结束,线程函数返回值放在tret中
28             printf("Join thread %d error!\n",no);
29             exit(1);
30         }else
31             printf("Join thread %d success!\n",no);
32     }
33         
34     return 0;
35 }
36 
37 void *thrd_func(void *arg){
38     int thrd_num=(void*)arg;
39     int delay_time=0;
40     int count=0;
41 
42     printf("Thread %d is starting.\n",thrd_num);
43     for(count=0;count<REPEAT_TIMES;count++) {
44         delay_time=(int)(DELAY*(rand()/(double)RAND_MAX))+1;
45         sleep(delay_time);
46         printf("\tThread %d:job %d delay =%d.\n",thrd_num,count,delay_time);
47     }
48 
49     printf("Thread %d is exiting.\n",thrd_num);
50     pthread_exit(NULL);
51 }
复制代码



 

线程同步与互斥
  线程共享进程的资源和地址空间,对这些资源进行操作时,必须考虑线程间同步与互斥问题
  三种线程同步机制
    •互斥锁
    •信号量
    •条件变量
  互斥锁更适合同时可用的资源是惟一的情况
    信号量更适合同时可用的资源为多个的情况 

 

 

互斥锁
  用简单的加锁方法控制对共享资源的原子操作
  只有两种状态: 上锁、解锁
可把互斥锁看作某种意义上的全局变量
  在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作
  若其他线程希望上锁一个已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止
互斥锁保证让每个线程对共享资源按顺序进行原子操作

 

 

互斥锁分类
  区别在于其他未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待
  快速互斥锁
    •调用线程会阻塞直至拥有互斥锁的线程解锁为止
    •默认为快速互斥锁
  检错互斥锁
    •为快速互斥锁的非阻塞版本,它会立即返回并返回一个错误信息
 
互斥锁主要包括下面的基本函数:
  互斥锁初始化:pthread_mutex_init()
  互斥锁上锁:pthread_mutex_lock()
  互斥锁判断上锁:pthread_mutex_trylock()
  互斥锁解锁:pthread_mutex_unlock()
  消除互斥锁:pthread_mutex_destroy()
 

 

View Code

和上一版本的程序差异在于有没有锁,有锁的情况下,必须等"thread x is exiting."之后其他线程才能继续。

 

 

信号量
  操作系统中所用到的PV原子操作,广泛用于进程或线程间的同步与互斥
    •本质上是一个非负的整数计数器,被用来控制对公共资源的访问
  PV原子操作:对整数计数器信号量sem的操作
    •一次P操作使sem减一,而一次V操作使sem加一
    •进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限
  –当信号量sem的值大于等于零时,该进程(或线程)具有公共资源的访问权限
  –当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于0为止
 
PV操作主要用于线程间的同步和互斥
  互斥,几个线程只设置一个信号量sem
  同步,会设置多个信号量,安排不同初值来实现它们之间的顺序执行

 

信号量函数
  sem_init() 创建一个信号量,并初始化它
  sem_wait()和sem_trywait(): P操作,在信号量大于零时将信号量的值减一
    •区别: 若信号量小于零时,sem_wait()将会阻塞线程,sem_trywait()则会立即返回
  sem_post(): V操作,将信号量的值加一同时发出信号来唤醒等待的线程
  sem_getvalue(): 得到信号量的值
  sem_destroy(): 删除信号量

 

eg. 同步各线程,执行顺序为逆序。

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 #include <semaphore.h>
 5 
 6 #define THREAD_NUM 3
 7 #define REPEAT_TIMES 5
 8 #define DELAY 4
 9 
10 sem_t sem[THREAD_NUM];
11 
12 void *thrd_func(void *arg);
13 
14 int main(){
15     pthread_t thread[THREAD_NUM];
16     int no;
17     void *tret;
18     
19     srand((int)time(0)); 
20 
21     // 初始化THREAD_NUM-1个信号量,均初始化为0
22     for(no=0;no<THREAD_NUM-1;no++){
23         sem_init(&sem[no],0,0);
24     }
25 
26     // sem[2]信号量初始化为1,即sem数组中最后一个信号量
27     sem_init(&sem[2],0,1);
28     
29     // 创建THREAD_NUM个线程,入口函数均为thrd_func,参数为(void*)no
30     for(no=0;no<THREAD_NUM;no++){
31         if (pthread_create(&thread[no],NULL,thrd_func,(void*)no)!=0) {
32             printf("Create thread %d error!\n",no);
33             exit(1);
34         } else
35             printf("Create thread %d success!\n",no);
36     }
37     
38     // 逐个join掉THREAD_NUM个线程
39     for(no=0;no<THREAD_NUM;no++){
40         if (pthread_join(thread[no],&tret)!=0){
41             printf("Join thread %d error!\n",no);
42             exit(1);
43         }else
44             printf("Join thread %d success!\n",no);
45     }
46     
47     // 逐个取消信号量
48     for(no=0;no<THREAD_NUM;no++){
49         sem_destroy(&sem[no]);
50     }
51 
52     return 0;
53 }
54 
55 void *thrd_func(void *arg){
56     int thrd_num=(void*)arg; // 参数no
57     int delay_time,count;
58 
59     // 带有阻塞的p操作
60     sem_wait(&sem[thrd_num]);
61 
62     
63     printf("Thread %d is starting.\n",thrd_num);
64     for(count=0;count<REPEAT_TIMES;count++) {
65         delay_time=(int)(DELAY*(rand()/(double)RAND_MAX))+1;
66         sleep(delay_time);
67         printf("\tThread %d:job %d delay =%d.\n",thrd_num,count,delay_time);
68     }
69 
70     printf("Thread %d is exiting.\n",thrd_num);
71     
72     // 对前一个信号量进行V操作
73     // 由于只有最后一个信号量初始化为1,其余均为0
74     // 故线程执行的顺序将为逆序
75     sem_post(&sem[(thrd_num+THREAD_NUM-1)%THREAD_NUM]);
76 
77     pthread_exit(NULL); // 线程主动结束
78 }
复制代码

Linux下多线程编程实例解析 提到线程,不得不让人想起进程,所以还是先写下进程与线程的区别吧! 一、进程与线程的区别 进程是程序执行的一个实例,进程有其自己独立的地址空间。一个线程可以含有多个线程,这也是为了提高系统资源利用率,线程的引入有其必然的优势,线程有自己的堆栈。记得操作系统的书籍上有一句经典的话”进程——资源分配的最小单位,线程——程序执行的最小单位“。一个通俗的比喻:进程就像一个人,而线程就好像人体内协 阅读详情

相关推荐

华硕ROG枪神双系统实战:Ubuntu安装避坑指南

本文是华硕ROG枪神笔记本安装Ubuntu双系统的详细避坑指南。针对其独特的硬件与BIOS设计,文章核心解决了VMD控制器导致硬盘无法识别、驱动兼容性等关键难题,并提供了从BIOS设置、分区方案到安装后驱动配置与性能调优的一站式解决方案,帮助用户实现稳定的双系统体验。

raspberrypi5的博客 545

linux时间片及线程调度相关的问题 收集整理

1.   在Linux   2.6上,怎么能够让一个线程每隔1ms起来运行一次?  我自己试用过以下两种方法,但结果不是很好,通过protype测试,大部分时间间隔是在1ms左右,但是总是有一部分时间间隔在好几个ms的级别,有的甚至是10ms以上。  (1)用settimer

YEYUANGEN的专栏 8804

Oasys安装教程

在基环境下执行然后去 C:\Users.condarc打开 .condarc这个文件 删除干净里面的东西。

weixin_44254178的博客 1296

linux多线程

#include #include #include #define THREAD_NUM 3 #define REPEAT_TIMES 5 #define DELAY 4 void *thrd_func(void *arg); int main(){ pthread_t thread[THREAD_NUM]; int no; void

CodingAdo 769

利用ArcGIS快速生成等高线边界,完成地形图拼图

地形图边界一般在CAD中手动绘制,然而,一幅边缘复杂的地形图边界的绘制需要花费大量时间和精力,为了减少重复性工作,提高效率,用ArcGIS软件可以自动生成实测地形图的边界

yl14774636230的博客 9070

机器人控制仿真软件:MATLAB Simulink Control System Toolbox_(1).MATLAB基础知识

MATLAB(Matrix Laboratory)是由MathWorks公司开发的一种高性能数值计算和可视化软件。它广泛应用于科学计算、工程设计、信号处理、控制系统设计、图像处理等领域。强大的矩阵运算能力:MATLAB的核心是矩阵运算,能够高效处理大规模的数值数据。丰富的工具箱:MATLAB提供了大量的工具箱,如Control System Toolbox、Simulink、Signal Processing Toolbox等,这些工具箱覆盖了多个应用领域。易于使用的图形界面。

kkchenjj的博客 907

如何理解线程可以共享地址空间?

这种共享的地址空间可以方便地在多个线程之间共享数据,但同时也需要小心处理并发问题,如竞态条件和数据竞争。为了确保线程安全,必须使用同步机制(如互斥锁、条件变量等)来保护共享的数据,以防止多个线程同时修改同一个内存地址而导致不可预测的结果.在C++中,线程共享地址空间是指在多线程编程中,所有线程都可以访问相同的内存地址。因此,一个线程对内存的修改可能会影响其他线程对相同内存的访问。

wjfdsklfdkfksd的博客 610

Ego Planner规划算法(下)——Ego Planner程序框架

本系列文章用于学习记录Ego-Planner规划算法的相关内容,本系列文章是在在Fast Planner规划算法系列文章的基础上,展开对Ego Planner的相关介绍,主要包括Ego Planner算法流程和程序框架两部分,主要学习资料是深蓝学院的移动机器人运动规划课程

慕羽★的博客 7260

Linux 系统上最常用的定时器

有时我们需要定时完成一些任务。简单的方法是使用 while 循环加 sleep。比如每隔 1 分钟检查链接情况的 heartbeat 任务等。比如: while(condtion) { //do something sleep(interval); } 这可以满足很多程序的定时需要,但假如您不希望程序“偷懒”,即上例中 sleep 的时候您还是希望程序做些有用的工作,那么使用定时器是通常的选择。Linux 系统上最常用的定时器是 setitmer 计时器。 setitimer Linux 系统为每个进

chen1415886044的博客 4492

STM32芯片解锁读写保护:更改Option Byte [Error已解决]

解锁读保护:STLink更改Option Byte 变Level从1变为0,点击Apply即可。(程序执行读保护,其实是将Level从0变为1) 默认情况下该保护功能是不开启的,若要开启该功能,需要改写内部FLASH选项字节(Option Bytes)中的配置。 RDP读保护级别 级别0,无保护, 级别1,使能读保护, 这种保护下,若使用调试功能(使用下载器、仿真器)或者从内部SRAM自举时都不能对内部FLASH及备份SRAM作任何访问(读写、擦除都被禁止); 当芯片处于级别1的时候,可以把选项字节

HowieXue 薛永浩的博客 2万+

华为OD机试真题 新系统 2026-09-26 Java&Go&C【数据中心最佳维护时间窗】

数据中心使用一个整数数组 scores,记录 N 小时内每小时的服务器得分(可正可负)。0 表示服务器故障(无效小时)。

MISAYAONE的博客 109

Linux线程编程

从上面我们知道了进程与线程的区别,其实这些区别也就是我们使用线程的理由。总的来说就是:进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。使用多线程的。

cykaw2590的博客 734

ModuleNotFoundError: No module named‘langchain.schema.output parserlangchain.schema is not a package

电脑里现有的langchain库版本与import所需的不同,卸载原有langchain,重新下载最新的langchain。在步骤1后,若仍不可运行。在确保已重新下载新langchain后,重启python后,可正常运行。在版本号中填入所需的langchain版本号,可在requirements.txt查看。运行如下代码时,出现error。

weixin_45751925的博客 1713

【Linux线程】Linux线程编程基础:概念、创建与管理

在当今的软件开发领域,多线程编程已经成为了一种不可或缺的技术。特别是在Linux操作系统环境下,多线程编程更是被广泛地应用于各种高性能、高并发的应用场景中。然而,多线程编程也是一项极具挑战性的任务,它要求开发者具备扎实的编程基础,对并发控制、资源管理等有深入的理解

EterNity_TiMe_的计算机学习之路 3626

假人有限元模型

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux系统编程-线程

本篇文章主要介绍了线程的一些概念和关于线程的一些常用API的使用,比如线程自身的API:pthread_slef、pthread_equal,创建线程pthread_create、退出线程pthread_exit、等待线程pthread_join;互斥锁相关API:创建锁pthread_mutex_init、销毁锁pthread_mutex_destroy,加锁pthread_mutex_lock、解锁pthread_mutex_unlock;还有和条件变量相关API等

dearzhangxp的博客 987

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Linux系统编程】多线程编程-POSIX线程

在Linux中,线程是系统调度的基本单位,是进程中的一个执行流。线程共享进程的资源(如内存空间、文件描述符等),但拥有独立的执行上下文(如栈、寄存器等)。

Stark的博客 1594

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux系统编程(线程)

分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源通俗的说也就是:我们知道一般我们要等待(pthread_join)一个线程的结束,主要是想知道它的结束状态,否则等待一般是没有什么意义的!加入pthread_join后,主线程会一直等待,直到等待的线程结束,自己才结束,使创建的线程有机会执行。​ 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源(栈),但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

jxcklfn的博客 1061

【Linux系统编程】线程

【Linux系统编程】线程 一、Linux线程介绍 1、进程与线程 2、使用线程的理由 3、Linux上线程开发API概要 二、与线程自身相关API 1. 线程创建 2. 线程退出 3. 线程等待 4. 线程脱离 5. 线程ID获取及比较 三、与互斥锁相关API 四、与条件变量相关API......

Zy_1213的博客 689

【Linux】多线程编程基础

无论你是否为程序员,相信多线程这个词汇应该都有所耳闻,像是在某个优化很差的游戏中听闻这游戏甚至是单线程的,如果你对多线程感兴趣,不妨点进本文来学习多线程编程,即使没有深厚的C/C++编程基础,你也能到本文学习到如何编写多线程程序。创建锁// 初始化锁 pthread_mutex_t 用于声明互斥量(mutex)对象。

CaTianRi的博客 1378

Linux多线程编程——线程

一、线程概述        前面讲到,进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时需要有比较复杂的上下文切换等动作。为了进一步减少处理机的空转时间,支持多处理器以及减少上下文切换开销,进程在演化过程中出现了另一个概念——线程。它是进程内独立的一条运行路线、处理器调度的最小单元,也可以称之为轻量级进程。线程可以对进程的内存空...

JIWilliams 2696

Linux多线程编程

Linux多线程编程一、线程理论基础二、多线程程序设计三、线程==同步==(按顺序) 一、线程理论基础 有了进程,为何还要引入线程呢?使用多线程有哪些好处? 1、和进程相比,线程是一种非常节俭的多任务操作方式,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表维护它的代码段、堆栈段、数据段,这是一种昂贵的多任务工作方式 运行于一个进程中的多线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间 2、线程间方便的通讯机制,对不同进程来说,它们具有独立的数据空间

qq_46186025的博客 4808

Linux系统编程之线程同步

在多线程编程中,线程同步是确保多个线程能够安全、高效协作的关键。当多个线程访问共享资源时,如果不加以控制,可能会导致不一致的状态或错误的行为。比如:两个线程同时尝试修改同一个变量,可能导致其中一个修改被覆盖,或者产生未定义的结果。为了避免这些问题,我们需要引入同步机制来协调线程之间的操作顺序,确保每次只有一个线程可以访问特定的资源。

hope_wisdom的技术博客 1740

Linux下多线程编程

多线程是指在一个进程中同时运行多个线程,每个线程可以独立执行不同的任务。线程是操作系统调度的最小单位,多个线程共享同一个进程的内存空间和资源,但每个线程有自己的栈和寄存器状态。本文展示Linux下多线程编程实例。

SEU123WW的博客 1178

Linux系统编程之多线程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运行单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。相比于进程,线程是轻量级的实体,它们共享进程的资源(比如:内存地址空间等),因此创建和销毁线程的成本较低。因为线程共享相同的地址空间,所以它们之间的通信非常高效,不需要像进程间通信那样通过复杂的机制。

hope_wisdom的技术博客 3095

线程与进程的深入解析及 Linux 线程编程

进程是程序的执行实例,是操作系统进行资源分配和调度的基本单位。每个进程都具有自己的独立内存空间、程序计数器、堆栈等资源。进程的创建过程是通过复制当前进程的数据来完成的,常见的系统调用有fork()和vfork()fork()vfork()exec()_exit()然而,进程的创建通常涉及大量的数据复制,影响系统的效率。这是因为每个进程都需要有独立的资源,造成一定的开销。

2503_90266635的博客 1881
下一篇: android学习篇
yuxuan_hit
博客等级 码龄15年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值