linux--posix多线程编程----第一篇

在C语言中使用POSIX线程库(pthread)实现多线程编程 在C语言中,我们可以使用POSIX线程库(pthread)来创建和管理线程。本文将详细介绍该库中主要包含的线程管理函数和线程同步函数,并给出了示例解析 阅读详情

本文转载,略有增删,以更容易理解。

第一篇只包括线程创建撤销和线程的私有数据。文章最后附一个简单的例子。


一   线程创建

1.1 线程与进程

相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

1.2 创建线程

POSIX通过pthread_create()函数创建线程,API定义如下:

int  pthread_create(pthread_t  *  thread, pthread_attr_t * attr, 
void * (*start_routine)(void *), void * arg)

与fork()调用创建一个进程的方法不同,pthread_create()创建的线程并不具备与主线程(即调用pthread_create()的线程)同样的执行序列,而是使其运行start_routine(arg)函数。thread返回创建的线程ID,而attr是创建线程时设置的线程属性(见下)。pthread_create()的返回值表示线程创建是否成功。尽管arg是void *类型的变量,但它同样可以作为任意类型的参数传给start_routine()函数;同时,start_routine()可以返回一个void *类型的返回值,而这个返回值也可以是其他类型,并由pthread_join()获取。

1.3 线程创建属性

pthread_create()中的attr参数是一个结构指针,结构中的元素分别对应着新线程的运行属性,主要包括以下几项:

__detachstate,表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。

__schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。

__schedparam,一个structsched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。

__inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。

__scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。

pthread_attr_t结构中还有一些值,但不使用pthread_create()来设置。

为了设置这些属性,POSIX定义了一系列属性设置函数,包括pthread_attr_init()、pthread_attr_destroy()和与各个属性相关的pthread_attr_get---/pthread_attr_set---函数。

1.4 线程创建的Linux实现

我们知道,Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork()。内核提供了两个系统调用__clone()和fork(),最终都用不同的参数调用do_fork()核内API。当然,要想实现线程,没有核心对多进程(其实是轻量级进程)共享数据段的支持是不行的,因此,do_fork()提供了很多参数,包括CLONE_VM(共享内存空间)、CLONE_FS(共享文件系统信息)、CLONE_FILES(共享文件描述符表)、CLONE_SIGHAND(共享信号句柄表)和CLONE_PID(共享进程ID,仅对核内进程,即0号进程有效)。当使用fork系统调用时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境,而使用pthread_create()来创建线程时,则最终设置了所有这些属性来调用__clone(),而这些参数又全部传给核内的do_fork(),从而创建的"进程"拥有共享的运行环境,只有栈是独立的,由__clone()传入。

Linux线程在核内是以轻量级进程的形式存在的,拥有独立的进程表项,而所有的创建、同步、删除等操作都在核外pthread库中进行。pthread库使用一个管理线程(__pthread_manager(),每个进程独立且唯一)来管理线程的创建和终止,为线程分配线程ID,发送线程相关的信号(比如Cancel),而主线程(pthread_create())的调用者则通过管道将请求信息传给管理线程。

线程取消

2.1 线程取消的定义

一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。

2.2 线程取消的语义

线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。

线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。

2.3 取消点

根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及read()、write()等会引起阻塞的系统调用都是Cancelation-point,而其他pthread函数都不会引起Cancelation动作。但是pthread_cancel的手册页声称,由于LinuxThread库与C库结合得不好,因而目前C库函数都不是Cancelation-point;但CANCEL信号会使线程从阻塞的系统调用中退出,并置EINTR错误码,因此可以在需要作为Cancelation-point的系统调用前后调用pthread_testcancel(),从而达到POSIX标准所要求的目标,即如下代码段:

pthread_testcancel();
    retcode = read(fd, buffer, length);
    pthread_testcancel();

2.4 程序设计方面的考虑

如果线程处于无限循环中,且循环体内没有执行至取消点的必然路径,则线程无法由外部其他线程的取消请求而终止。因此在这样的循环体的必经路径上应该加入pthread_testcancel()调用。

2.5与线程取消相关的pthread函数

int pthread_cancel(pthread_t thread)
发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。

int pthread_setcancelstate(int state, int *oldstate)
设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为NULL则存入原来的Cancel状态以便恢复。

int pthread_setcanceltype(int type, int *oldtype)
设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出);oldtype如果不为NULL则存入运来的取消动作类型值。

void pthread_testcancel(void)
检查本线程是否处于Canceld状态,如果是,则进行取消动作,否则直接返回。

二  线程私有数据

概念及作用


为什么需要私有数据:http://www.cppblog.com/prayer/archive/2009/07/05/89286.html

linux下的线程真是很有趣,各种在windows编程里看不到的技巧在这里尽显无余。在一个进程里有许多的线程,这些线程共享进程里的所有资源。包括数据空间,所以全局变量是为所有的线程所共享的。但如果线程里的全局变量为所有的线程所共享会出现一些问题。比如如果代码量很大的话那么名字的命名都是一个问题。如果两个线程有相同的全局erron变量那么线程2可以会用到线程1的出错提示。(两个线程用到同样的名字)

这个问题可以通过创建线程的私有数据来解决(thread-specific Data,TSD)。一个线程里的TSD只有这个线程可以访问。

TSD采用了一种称之为私有数据的技术,即一个键对应多个数据值。意思就好比用一个数据结构,这个结构的结构名就是键值,在这个结构里有许多的数据,这些数据封闭在这个结构里。线程可以通过这个结构名即键值来访问其所属的数据结构。


概念

在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问,比如程序可能需要每个线程维护一个链表,而使用相同的函数操作,最简单的办法就是使用同名而不同变量地址的线程相关数据结构。这样的数据结构可以由Posix线程库维护,称为线程私有数据(Thread-specificData,或TSD)。

创建和注销

Posix定义了两个API分别用来创建和注销TSD:

int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *))

该函数从TSD池中分配一项,将其值赋给key供以后访问使用。如果destr_function不为空,在线程退出(pthread_exit())时将以key所关联的数据为参数调用destr_function(),以释放分配的缓冲区。

不论哪个线程调用pthread_key_create(),所创建的key都是所有线程可访问的,但各个线程可根据自己的需要往key中填入不同的值,这就相当于提供了一个同名而不同值的全局变量。在LinuxThreads的实现中,TSD池用一个结构数组表示:

static struct pthread_key_struct pthread_keys[PTHREAD_KEYS_MAX] = { { 0, NULL } };

创建一个TSD就相当于将结构数组中的某一项设置为"in_use",并将其索引返回给*key,然后设置destructor函数为destr_function。

注销一个TSD采用如下API:

int pthread_key_delete(pthread_key_t key)

这个函数并不检查当前是否有线程正使用该TSD,也不会调用清理函数(destr_function),而只是将TSD释放以供下一次调用pthread_key_create()使用。在LinuxThreads中,它还会将与之相关的线程数据项设为NULL(见"访问")。

访问

TSD的读写都通过专门的Posix Thread函数进行,其API定义如下:

int  pthread_setspecific(pthread_key_t  key,  const   void  *pointer)
void * pthread_getspecific(pthread_key_t key)

写入(pthread_setspecific())时,将pointer的值(不是所指的内容)与key相关联,而相应的读出函数则将与key相关联的数据读出来。数据类型都设为void*,因此可以指向任何类型的数据。

在LinuxThreads中,使用了一个位于线程描述结构(_pthread_descr_struct)中的二维void*指针数组来存放与key关联的数据,数组大小由以下几个宏来说明:

#define PTHREAD_KEY_2NDLEVEL_SIZE       32
#define PTHREAD_KEY_1STLEVEL_SIZE   \
((PTHREAD_KEYS_MAX + PTHREAD_KEY_2NDLEVEL_SIZE - 1)
/ PTHREAD_KEY_2NDLEVEL_SIZE)
    其中在/usr/include/bits/local_lim.h中定义了PTHREAD_KEYS_MAX为1024,
    因此一维数组大小为32。而具体存放的位置由key值经过以下计算得到:
idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE
idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE

也就是说,数据存放与一个32×32的稀疏矩阵中。同样,访问的时候也由key值经过类似计算得到数据所在位置索引,再取出其中内容返回。

使用范例

以下这个例子没有什么实际意义,只是说明如何使用,以及能够使用这一机制达到存储线程私有数据的目的。

#include <stdio.h>
#include <pthread.h>
pthread_key_t   key;
void echomsg(int t)
{
        printf("destructor excuted in thread %d,param=%d\n",pthread_self(),t);
}
void * child1(void *arg)
{
        int tid=pthread_self();
        printf("thread %d enter\n",tid);
        pthread_setspecific(key,(void *)tid);//变量私有化
        sleep(2);
        printf("thread %d returns %d\n",tid,pthread_getspecific(key));
        sleep(5);
}
void * child2(void *arg)
{
        int tid=pthread_self();
        printf("thread %d enter\n",tid);
        pthread_setspecific(key,(void *)tid);//变量私有化
        sleep(1);
        printf("thread %d returns %d\n",tid,pthread_getspecific(key));
        sleep(5);
}
int main(void)
{
        int tid1,tid2;
        printf("hello\n");
        pthread_key_create(&key,echomsg);//设置私有变量标志
        pthread_create(&tid1,NULL,child1,NULL);
        pthread_create(&tid2,NULL,child2,NULL);
        sleep(10);
        pthread_key_delete(key);
        printf("main thread exit\n");
        return 0;
}

给例程创建两个线程分别设置同一个线程私有数据为自己的线程ID,为了检验其私有性,程序错开了两个线程私有数据的写入和读出的时间,从程序运行结果可以看出,两个线程对TSD的修改互不干扰。同时,当线程退出时,清理函数会自动执行,参数为tid。



c++版本的例子--crazyhacking

#include<iostream>
#include<pthread.h>
using namespace std;

pthread_key_t key;
void destefunc(void *t)
{
pthread_t *s=(pthread_t *)t;
cout<<"this thread exit:"<<pthread_self()<<" "<<t<<" "<<s[0]<<endl;
}
void* func1(void *arg)
{
pthread_t tid=pthread_self();
pthread_setspecific(key,(void *)tid);
sleep(2);
cout<<"func1:"<<tid<<endl;
cout<<(pthread_t)pthread_getspecific(key)<<endl;
}

void* func2(void *arg)
{
//int test1= 2;
//cout<<"func2:"<<test1<<endl;
pthread_t tid=pthread_self();
pthread_setspecific(key,(void *)tid);
cout<<"func2:"<<tid<<endl;
}

int main()
{
pthread_t tid1,tid2;
pthread_key_create(&key,destefunc);//设置私有变量标志
pthread_create(&tid1,NULL,func1,NULL);
//cout<<tid1<<endl;
pthread_create(&tid2,NULL,func2,NULL);
//cout<<tid2<<endl;
sleep(10);//为了使得子进程先结束
pthread_key_delete(key);
cout<<"ok,main thread exit"<<endl;
return 0;
}


参考网址:    Posix线程编程指南


Linux:命令:ps、进程状态,线程优先级/priority; defunct 进程状态说明 关于不可中断的休眠的解释 https://eklitzke.org/uninterruptible-sleep https://lwn.net/Articles/288056/ 进程状态代码:下面是s, stat 和 state 输出的限定词 specifiers (表头"STAT" or "S"): D uninterruptible sleep (usually IO) 、不可中断休眠,一般是 IO操作 I Idle kernel thread,空闲内核线程 阅读详情

相关推荐

arcgis建筑数据的矢量化(一)

简单来说,建筑数据的获取无外乎是矢量化和去网站下载 无奈的是,osm和网上的建筑数据只有全国的主要城市,实在是为难我们这些小城市的,百度和天地图上是有建筑数据,无奈人家不要开放下载啊,所以就只能矢量化咯, 矢量化,无外乎手动和自动,手动就是新建shp面手动勾绘,这里就不讲了,我们来看看自动矢量化 自动矢量化在arcgis中主要是利用arcscan和栅格转面(栅格转面这个效果真是一言难尽,所以我们主要讨论arcscan) 同时我们矢量化也不一定要局限于arcgis...

Jasenjane的博客 3925

(转)Linux 多线程编程---pthread_testcancel()等讲解

1. 所谓线程就是“一个进程内部的一个控制序列”。也就是一个进程内部的并行的基础!2. Linux进程可以看成只有一个控制线程: 一个进程在同一时刻只做一件事情。有了多个控制线程以后, 在程序设计时可以把进程设计成在同一时刻能够做不止一件事, 每个线程处理各只独立的任务。即所谓并行! 3. 线程的优点: (1)通过为每种事件类型的处理分配单独的线程,能够简化处理异步时间的代码。 (2)多个线程可以自动

modi000的博客 2246

星座SAR动目标检测(GMTI)

参考代码 星座SAR动目标检测 www.youwenfan.com/contentcsg/52399.html。

feifeigo123的博客 549

Linux多线程 PTHREAD_EXPLICIT_SCHED

最近在搞Linux上的多线程,在网上一搜有很多介绍是文章。简单的说就是用pthread_create创建线程,在创建线程之前可以设置线程的属性,包括调度策略、优先级、栈大小等等,这些函数都可以man出来,也可以通过/usr/include/pthread.h查找自己想要的哪方面的函数再进行编程。其中遇到的一个比较恶心的事情是在线程启动后设置优先级,但是pthread_getschedparam得到

giskook的专栏 7737

Unity调用手机摄像头避坑指南:从权限检测到自动对焦问题解决

本文深入解析了Unity移动端集成手机摄像头时遇到的权限、对焦与性能等核心难题。针对权限管理,提供了健壮的原生接口调用方案;针对自动对焦模糊问题,详细对比了原生插件与第三方插件两种解决路径;并分享了分辨率选择、数据处理及功耗控制等关键性能优化技巧,帮助开发者构建稳定高效的摄像头功能。

weixin_29007243的博客 469

[Python图像处理] 十.形态学之图像顶帽运算和黑帽运算

数学形态学(Mathematical morphology)是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。本篇文章主要讲解Python调用OpenCV实现图像形态学转化,包括图像顶帽运算和图像黑帽运算,基础性知识希望对您有所帮助。

杨秀璋的专栏 1万+

对于线程,你真的懂了吗?

背景 上周在处理一个问题,涉及到了线程调度策略的问题。因为我们要求线程的属性默认为实时策略(SCHED_RR),但是通过proc文件系统查看,实际生效的是分时调度策略(SCHED_OTHER)。通过分析,发现是由于创建线程是设置的参数并不正确,导致的问题。也顺便复习和了解了一下线程创建属性的知识点。在这里做一个记录,当做是以后的复习知识点之一。 我们知道创建线程的API为 int pthread_...

点滴路程 1393

【unity实战】Unity手搓脚本工具实现合并网格功能

本文介绍了在Unity中优化网格性能的方法,通过合并重复网格减少绘制调用。主要使用Mesh.CombineMeshes方法实现网格合并,支持统一材质和多材质处理。核心内容包括:1)基础合并脚本实现,将子网格合并到父对象并禁用原网格;2)统一材质设置,支持自定义或默认材质;3)多材质合并方案,通过设置mergeSubMeshes=false保留子网格材质索引。文章还提供了完整代码示例和操作演示,适用于实际项目中的网格优化需求。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 556

linux线程取消, pthread线程取消,pthread_testcancel用法

linux线程取消理解,thread取消

gdizcm的专栏 2595

Python 爬虫教程:财经新闻实时抓取(最新资讯 + 关键词提取)

在当今信息爆炸的时代,财经新闻的实时获取对于投资者、研究人员以及普通大众来说都具有重要的价值。通过 Python 爬虫技术,我们可以高效地抓取财经新闻,并提取其中的关键信息,以便更好地进行数据分析和决策支持。本文将详细介绍如何使用 Python 编写一个财经新闻实时抓取系统,并结合关键词提取技术,帮助读者快速掌握 Python 爬虫的核心技能。

yansideyucsdn的博客 1049

基于 Simulink 的固态变压器(SST)多级协同控制实战教程

《固态变压器多级协同控制仿真指南》摘要: 本教程详细讲解了基于Simulink的固态变压器(SST)三级架构建模与控制方法。核心内容包含:1)搭建级联H桥整流(CHB)、双有源桥(DAB)和逆变器(VSI)的三级主电路;2)提出创新的多级协同控制策略,通过功率前馈实现输入输出级动态匹配;3)给出系统级功率平衡、单元级均压控制的具体实现方案。教程特别强调解决实际工程中的关键问题:代数环处理、软启动设计和刚性系统求解器选择,并提供了硬件在环(HIL)仿真建议。附带的MATLAB代码示例可直接用于实现电容电压均衡

xiaoheshang_123的博客 117

linux posix 线程池_linux--posix多线程编程----第一篇

本文转载,略有增删,以更容易理解。第一篇只包括线程创建撤销和线程的私有数据。文章最后附一个简单的例子。一 线程创建相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;...

weixin_39916520的博客 98

Central Finance 全景解析:用 SAP S/4HANA 构建跨系统的财务中台与渐进式转型路径

Central Finance 是基于 SAP S/4HANA 的一种部署与应用场景:在不打断现有异构源系统运营的前提下,把多套 SAP 与非 SAP 系统中的财务与管理会计数据实时/准实时复制到一套中心化的 SAP S/4HANA 中,作为统一的记账与分析底座,逐步把选定的财务流程(如预算控制、付款、固定资产结账等)迁入中心系统。这让企业既能快速获得统一报表与统一核算结构,又为未来的整体迁移留出了弹性路径。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 387

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

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

Stark的博客 1594

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

Linux系统编程之多线程

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

hope_wisdom的技术博客 3094

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

细谈linux下的posix多线程编程

下面实现一个简单的多线程编程的例子。#include #include #include #include #include char message[]="Hello World!"; void * thread_function(void * arg); int main() { pthread_t second_thread; void * thread_result; // create new thread if(pthread_create(

piaojun_pj的专栏 2370

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Linux】多线程:POSIX库、线程管理、线程ID

我们知道,不同的操作系统中,实现线程的方式并不一致,这就造成了在Linux系统中使用系统调用编写的多线程程序在其他操作系统中可能并不适用。这是因为Linux中的线程是用户级线程,由POSIX库对其进行管理,所以我们在程序中所打印出来的线程ID实际是库给我们所分配的线程唯一标识。:在内核态中,线程ID和进程ID的管理是由内核直接处理的。我们能够观察到,这两个线程同属于一个进程之中,并且有一个线程(轻量级进程)的ID与进程的ID相同,这就是我们所说的“主线程”,主线程并不需要我们手动创建,

2301_76606232的博客 1534

linux下的POSIX C 多线程编程 helloworld

#include #include #include #include #define MAX 10 pthread_t thread[2]; pthread_mutex_t mut; int number = 0; int i; void* thread1( void *param ) { printf( "thread1: I'm thread 1\n " );

辉仔 の专栏 2228

【嵌入式Linux应用开发基础】多线程编程

多线程编程在嵌入式Linux应用开发中具有重要意义。通过合理设计和使用线程,可以充分利用CPU资源,提高程序的运行效率和响应速度。同时,也需要注意线程同步和互斥问题,以确保程序的正确性和稳定性。

byte轻骑兵的技术小窝 2125

【Linux Posix】Linux Posix编程入门(合集)

【Linux Posix】(01)Linux Posix 编程入门 【Linux Posix】(02)Vim编辑器的使用 【Linux Posix】(03)编译器gcc的使用 【Linux Posix】(04)调试器gdb的使用 【Linux Posix】(05)工程管理器make的使用(Makefile) 【Linux Posix】(06)文件IO编程I - 文件的创建和读写 【Linux Posix】(07)文件IO编程II - 文件的各个属性和目录操作 【Linux Posix】(08)

风浪云HH的博客 1889

【Linux】多线程概念 | POSIX线程库

线程是比进程更加轻量化的一种执行流,线程是在进程内部执行的一种执行流,线程是CPU调度的基本单位,而进程是承担系统资源的基本实体。换言之,当我们创建进程时是创建一个task_struct、创建地址空间、维护页表,然后在物理内存当中开辟空间、构建映射,打开进程默认打开的相关文件、注册信号对应的处理方案等等。在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。

宁清的博客 1525

Linux 系统中的 POSIX 接口详细介绍

Linux 系统中的 POSIX 接口详细介绍

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 1万+

Windows下 POSIX 线程编程

1. POSIX 标准        POSIX是Portable Operating System Interface of Unix的缩写。由IEEE(Institute of Electrical and Electronic Engineering)开发,由ANSI和ISO标准化。        POSIX的诞生和Unix的发展是密不可分的,Unix于70年代诞生于Bell lab,并

Kevin的专栏 7257

【Linux】多线程6——POSIX信号量,环形队列cp问题

此时由于生产者生产的很快,运行代码后一瞬间生产者就将环形队列打满了,此时生产者想要再进行生产,但空间资源已经为0了,于是生产者只能在blank_sem的等待队列下进行阻塞等待,直到由消费者消费完一个数据后对blank_sem进行了V操作,生产者才会被唤醒进而继续进行生产。虽然消费者消费的很快,但一开始环形队列当中的数据资源为0,因此消费者只能在data_sem的等待队列下进行阻塞等待,直到生产者生产完一个数据后对data_sem进行了V操作,消费者才会被唤醒进而进行消费。

2301_80224556的博客 2339
上一篇: ICE中间件第一篇----简介
下一篇: 一个分布式架构
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值