线程管理二

AI编程省Token实测:CodeGraph、AOCI与Understand Anything对比 在AI辅助编程中,Token消耗正成为开发者关注的成本焦点。传统RAG检索易因语义相似而注入无关代码,导致上下文超载与费用飙升。知识图谱、上下文注入优化与项目通用理解是三种主流省Token技术路线:前者通过调用链精准定位代码片段,中者按相关度过滤注入内容,后者以全量索引减少多轮试错对话。三者分别适用于跨模块重构、高频小步编码与陌生代码库探索等场景。本文基于真实项目的多组对比实测,分析省Token比例、接入成本与适用边界,并指出认证报错、用量统计失真等实践陷阱,帮助开发者在保证AI输出质量的前提下理性选择工具 阅读详情
线程管理二
一、前言:
线程是进程内部的一条执行序列,那么对于一个进程中多个线程之间,数据的共享是怎么具体操作的呢,我们对线程之间,全局数据。堆区数据、文件描述符会进行测试,以及线程之间的同步。

二、线程之间数据共享测试:

全局数据共享测试:
代码如下:

data_pthread.c文件

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

//全局变量
int data = 10;

void *fun(void *arg)
{
	data = 20;	
	pthread_exit("baby");//功能:结束线程,参数是传递线程结束信息
}


void main()
{
	pthread_t id;
	int res = pthread_create(&id,NULL,fun,NULL);
	assert(res == 0);
	sleep(2);
	printf("data == %d\n",data);
	char *p = NULL;
	pthread_join(id,(void *)&p);//等待线程结束,参数是接收线程结束信息
	printf("%s\n",p);
}
Linux下gcc命令:
gcc -o  data  data_pthread.c  -lpthread
运行:./data

结果:


我们一开始定义一个全局数据data = 10;然后函数线程进行修改,修改data= 20;通过主线程打印data的值。如果主线程打印是20,说明全局数据共享。由上面的运行结果得出,线程之间全局数据共享。

堆区数据共享测试:
代码如下:

heap_pthread.c文件

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


int *p = NULL;

void *fun(void *arg)
{
	p = (int *)malloc(10);
	*p = 20;
}


void main()
{
	pthread_t id;
	int res = pthread_create(&id,NULL,fun,NULL);
	assert(res == 0);
	sleep(1);
	printf("p =  %d\n",*p);
	pthread_join(id,NULL);
}
Linux下gcc命令:
gcc -o   heap  heap_pthread.c   -lpthread
运行: ./heap

结果:


我们一开始定义一个指针,然后在函数线程中进行开辟空间,并且修改值为20,通过主线程进行打印,结果是20的话说明线程之间在堆区数据也共享,看运行结果则说明线程之间在堆区数据是共享的。


文件描述符共享:
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <fcntl.h>

int fd = 0;
//判断同一进程下多线程对文件描述读共享
void *fun(void *arg)
{
    fd = open("lock.c",O_RDONLY);
	assert(fd != -1);
	if (fd == -1)
	{
		pthread_exit("0");
	}
	pthread_exit("1");
}

int main()
{
	pthread_t id;
	int res = pthread_create(&id,NULL,fun,NULL);
	assert(res == 0);
	sleep(2);
	char buff[128] = {0};
	while(1)
	{
		int n = read(fd,buff,127);
		if (n <= 0)
		{
			break;
		}
		printf("%s",buff);
	}
	printf("\n");
}
Linux下gcc命令:
gcc -o  file  file_pcb.c   -lpthread
运行:./file

结果:


从函数线程打开一个文件,而从主线程进行读取文件中的内容到屏幕,如果文件描述符共享则成功打印,由上述运行结果得出文件描述符在线程之间是共享的。

三、线程同步:访问临界资源控制

a. 用信号量实现线程同步:

信号量一个特殊类型的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作,在一个多线程程序中也是这样,所以当一个程序中有两个(多个)线程试图改变一个信号量的值,系统保证所有的操作都一次进行。
信号量的函数都以sem_开头。今天说的是线程中使用的信号量函数;

头文件:
semaphore.h

sem_init函数:初始化函数
int sem_init(sem_t  *sem,  int  pshared,  unsigned  int  value);
第一个参数sem指向的是信号量对象,设置它的共享选项,给它一个初始的整数值;
第二个参数pshared参数控制信号量的类型,如果其值为0,就表示这个信号量是的当前进程的局部信号量,否则,这个信号量就可以在多个进程之间共享;
第三个参数value是给信号量的初值;

P操作:int sem_wait(sem_t  *sem);     -1操作;通过sem_wait使得其他线程阻塞
V操作:int sem_post(sem_t  *sem);     +1操作;
两个函数的参数都是一个指针,这个指针指向的对象是sem_init调用初始化的信号量。

销毁:
int sem_destroy(sem_t  *sem);
参数是一个指向信号量的指针,并清理该信号量所拥有的所有资源。如果企图清理的信号量正被一些线程等待,就会收到一个错误。
返回值:以上这些函数成功都会返回0;

测试练习:
题目:主线程接收用户输入,函数线程统计输入的字符个数,当用户输入end的时候结束统计。

代码如下:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <assert.h>

#include <pthread.h>

#include <fcntl.h>

#include <semaphore.h>



sem_t sem1;

sem_t sem2;



void *work_thread(void *arg)

{

	char *buff = (char *)arg;

	while(1)

	{

		sem_wait(&sem1);

		if(strncmp(buff, "end", 3) == 0)

		{

			break;

		}

		int i = 0, count = 0;

		for(; buff[i] != 0; ++i)

		{

			count++;

		}



		printf("字符个数为:  %d\n", count);

		sem_post(&sem2);

	}

}





void main()

{

	char buff[128] = {0};

	pthread_t id;

	sem_init(&sem1, 0, 0);

	sem_init(&sem2, 0, 1);

	int res = pthread_create(&id, NULL, work_thread, (void *)buff);

	assert(res == 0);



	while(1)

	{

		sem_wait(&sem2);

		memset(buff, 0, 128);

		printf("请输入需要统计的字符: ");

		fflush(stdout);



		fgets(buff, 128, stdin);

		buff[strlen(buff) - 1] = 0;

		sem_post(&sem1);

		if(strncmp(buff, "end", 3) == 0)

		{

			break;

		}

	}

}
Linux下gcc命令:
gcc -o  sem  sem_pthread.c  -lpthread
运行:./sem

结果:


信号量sem1控制的是主线程给函数线程提供数据;
信号量sem2控制的是主线程得到函数线程的统计字符的结果,并继续由用户输入字符。

b.用互斥锁实现线程同步

理论:互斥量允许程序员锁住某个对象,使得每次只能有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作后解锁它。

头文件:pthread.h
对象  pthread_mutex_t   mutex;
初始化:int  pthread_mutex_init(pthread_mutex_t  *mutex,  const  pthread_mutexattr_t  *mutexattr);
加锁:int  pthread_mutex_lock(pthread_mutex_t  *mutex);
解锁:int  pthread_mutex_unlock(pthread_mutex_t  *mutex);
销毁:int pthread_mutex_destroy(pthread_mutex_t  *mutex);
参数:以上函数的参数mutex都是声明过的对象的指针。这个对象的类型为pthread_mutex_t 。
init的第二个参数是设置互斥量的属性。而属性控制着互斥量的行为。属性类型默认为fast。

设置属性的缺点:如果程序对一个加锁的互斥量再次调用加锁函数,这时候,程序就会阻塞,而又因为拥有互斥量的这个线程正是被阻塞的线程,所以互斥量永远也不会解锁了,程序也就进入了死锁的状态。解决方法:改变互斥量的属性,如果遇到上述情况就返回一个错误,或者让它递归操作,给同一个进程加多个锁,相应的后面执行相同数量的解锁操作。
平常我们会把第二个参数设置为 NULL传递给属性指针,也就是默认行为。

测试练习:
题目:主线程接收用户输入,函数线程统计输入的字符个数,当用户输入end的时候结束统计。
代码如下:

lock_pthread.c文件;

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <assert.h>

#include <pthread.h>

#include <fcntl.h>

#include <semaphore.h>



pthread_mutex_t mutex;



void *work_thread(void *arg)

{

	char *buff = (char *)arg;

	while(1)

	{

		pthread_mutex_lock(&mutex);

		if(strncmp(buff, "end", 3) == 0)

		{

			break;

		}

		int i = 0, count = 0;

		for(; buff[i] != 0; ++i)

		{

			count++;

		}



		printf("输入的字符个数为:  %d\n", count);

		pthread_mutex_unlock(&mutex);

		sleep(1);

	}

}





void main()

{

	char buff[128] = {0};

	pthread_t id;

	int res = pthread_create(&id, NULL, work_thread, (void *)buff);

	assert(res == 0);

	pthread_mutex_init(&mutex,NULL);

	while(1)

	{

		pthread_mutex_lock(&mutex);

		memset(buff, 0, 128);

		printf("请输入需要统计的字符: ");

		fflush(stdout);

		fgets(buff, 128, stdin);

		buff[strlen(buff) - 1] = 0;

		pthread_mutex_unlock(&mutex);

		if(strncmp(buff, "end", 3) == 0)

		{

			break;

		}

		sleep(1);

	}

	pthread_join(id,NULL);

	pthread_mutex_destroy(&mutex);

}
Linux下gcc命令:
gcc  -o  lock   lock_pthread.c  -lpthread
运行:./lock

结果:


在程序的开始我们声明了一个互斥量对象,然后在函数线程中进行初始化互斥量。主线程首先试图对互斥量加锁,。如果它已经锁住,这个调用将被阻塞直到它被释放为止,当用户字符输入完毕后,主线程会解锁,这时候,函数线程会进行字符统计,并加锁,防止主线程操作临界资源,当函数线程统计字符完成后,会进行解锁操作,这时候主线程才能继续让用户输入字符。也就是周期性地循环操作加锁,解锁,直到遇到用户输入end,结束程序。

c.条件变量解决线程同步

条件变量是线程可用的另一种同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时、允许进程以无竞争的方式等待特定的条件发生。
条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。
条件变量使用之前必须首先进行初始化。
头文件:pthread.h
条件变量类型:pthread_cond_t;

初始化函数:
int  pthread_cond_init(pthread_cond_t  *restrict  cond,  pthread_condattr_t  *restrict  attr);
attr参数设置为NULL;
在释放底层的内存空间之前,使用pthread_mutex_destroy函数对条件变量进行去初始化:

条件变量销毁:
int  pthread_cond_destroy(pthread_cond_t  *cond);

pthread_cond_wait函数:
使用pthread_cond_wait 等待条件变为真;
int  pthread_cond_wait(pthread_cond_t  *restrict  cond,pthread_mutex_t  *restrict  mutex);
传递给pthread_cond_wait的互斥量对条件进行保护,调用者把锁住的互斥量传给函数。
当pthread_cond_wait返回时,互斥量再次被锁住。

用于通知线程条件已经满足的两个函数:
pthread_cond_signal函数:
唤醒等待该条件的某个线程;
int  pthread_cond_signal(pthread_cond_t  *cond);

pthread_cond_broadcast函数:
唤醒等待该条件的所有线程;
int pthread_cond_broadcast(pthread_cond_t  *cond);
两个函数返回值:成功返回0;失败返回错误编号;

调用pthread_cond_signal或者pthread_cond_broadcast,也称为向线程或条件发送信号。必须注意一定要在改变条件状态以后再给线程发送信号。

四、线程安全------可重入函数
首先,编写以下代码:

文件:safe_pthread1.c

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


void *fun(void *arg)
{
	char arr[] = "a b c d e f g";
	char *p = strtok(arr," ");
	while(p != NULL)
	{
		printf("fun: %s\n",p);
		sleep(1);
		p = strtok(NULL," ");
	}

}

void main()
{
	pthread_t id;
	int res = pthread_create(&id ,NULL,fun,NULL);
	assert(res == 0);
	char buff[] = "1 2 3 4 5 6 7";
	char *p = strtok(buff," ");
	while(p != NULL)
	{
		printf("main : %s\n",p);
		sleep(1);
		p = strtok(NULL, " ");
	}
}
Linux下gcc命令:
gcc  -o  safe1  safe_pthread1.c  -lpthread
运行:./safe1

结果:


按照正常逻辑,应该是交替打印1,a,2,b,3,c,4,d,5,e,6,f,7,g。但是只打印了数字只有一个1,再的全是字母,这是为什么呢?

说到这里,就要提出线程安全的定义了,如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是安全的,而我们这里的strtok函数在POSIX.1中是不能保证线程安全的函数。所以它出现了这种多个控制线程在同一时间潜在的调用了strtok这个不安全的函数,使得出现意想不到的结果。那么关于这些不安全的函数还有哪些呢?


以上都是不能保证线程安全的函数;
那么怎么解决呢?
针对以上可能不安全的函数,操作系统对支持线程安全的这一特性时,对非线程安全函数提供了可替代的安全版本;如下图:


那么我们对以上代码进行修改:
代码如下:

文件:safe_pthread.c

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


void *fun(void *arg)
{
	char arr[] = "a b c d e f g";
	char *q = NULL;
	char *p = strtok_r(arr," ",&q);
	while(p != NULL)
	{
		printf("fun: %s\n",p);
		sleep(1);
		p = strtok_r(NULL," ",&q);
	}

}

void main()
{
	pthread_t id;
	int res = pthread_create(&id ,NULL,fun,NULL);
	assert(res == 0);
	char buff[] = "1 2 3 4 5 6 7";
	char *q = NULL;
	char *p = strtok_r(buff," ",&q);
	while(p != NULL)
	{
		printf("main : %s\n",p);
		sleep(1);
		p = strtok_r(NULL, " ", &q);
	}
}
Linux下gcc命令:
gcc -o  safe  safe_pthread.c   -lpthread
运行:./safe

结果:


以上使用正确的安全版本的strtok_r函数,所运行得到的结果才是我们想要的。

Android-Glide源码解析(二)线程管理 Glide源码解析-线程管理 阅读详情

相关推荐

001_安全函数_C_safe_library

这里我们对这个返回值一般不关心,因为我们主要是初始化内存块,获得返回值对于我们来说也并没有什么太大的用,是作为返回给系统进行校验的,这个有兴趣的可以去查询下关于size_t,errno_t, rsize_t类型的定义和含义,我们这里主要介绍函数功能和使用。返回一个整数,0表示复制成功,返回非0值代表复制不成功,不同的值表示不同的错误,具体内容可以查阅MSDN手册。返回一个整数,0表示复制成功,返回非0值代表复制不成功,不同的值表示不同的错误,具体内容可以查阅MSDN手册。

qq_47325567的博客 2786

嵌入式串口AT指令解析:memset与strstr工程实践

在嵌入式系统中,串口通信常用于MCU与Wi-Fi、GSM等外设模块的指令交互,其核心是基于ASCII字符串的异步协议解析。该过程依赖标准C字符串操作机制:通过memset初始化接收缓冲区以确保内存边界可控,再利用strstr实现子串匹配完成响应识别。这种‘清零+搜索’组合不仅规避了未初始化内存导致的HardFault风险,也支撑了AT指令集这类文本协议的可靠解析。典型应用场景包括物联网终端的网络附着状态判断(如AT+CGATT?)、模块就绪检测(READY)及指令执行结果反馈(OK/ERROR)。本文围绕S

weixin_42453228的博客 362

激光可燃气体传感器:核心技术环节分析

激光可燃气体传感器核心技术涵盖七个维度:1)TDLAS光谱吸收与调制技术(检测下限ppm级);2)DFB激光器与双闭环温控系统(波长稳定性±0.0036nm);3)微弱信号处理技术(信噪比提升60dB);4)环境补偿算法(温压补偿误差<±1%);5)本质安全防爆设计(ExiaIICT4Ga等级);6)智能边缘计算(STM32L476芯片);7)多重性能验证(响应时间<1秒)。通过微型化、多气体检测等创新,该技术已在工业安全等领域替代传统方案,实现高精度检测。(149字)

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1040

memset 线程安全_可重入性和线程安全性

可重入性和线程安全性都与该函数如何处理资源有关. 但是,它们是不同的:重入函数既不会在连续调用中存储静态数据,也不会返回指向静态数据的指针. 对于此类功能,调用者将提供该功能所需的所有数据,例如指向任何工作区的指针. 这意味着对一个函数的多个并发调用不会互相干扰.注意: 可重入函数不能调用非可重入函数.线程安全功能使用锁来保护共享资源,以防止并发访问它们. 线程安全仅涉及功能的实现方式,而不涉及其...

weixin_39665379的博客 1205

USB HID虚拟电池:Windows零驱动电源状态模拟方案

虚拟电池是一种在硬件测试与功耗分析中替代真实电池、实现可控电源状态注入的关键技术。其核心原理是通过标准USB HID协议(特别是UPS设备类)向操作系统上报可编程的AC/DC状态、剩余电量、容量参数等,绕过内核驱动限制,达成毫秒级响应与跨Windows版本兼容。该技术显著提升SoC能效验证、电池健康度校准及低电量行为触发等场景的可重复性与精度。本文基于CH554微控制器实现符合HID UPS规范的物理层虚拟电池设备,支持零驱动安装、USB原生识别与实时参数调控,适用于笔记本平台功耗建模、电源管理策略验证及自

weixin_35755188的博客 354

从UART到RS485:手把手教你用SIT3485E收发器搞定工业级通信(含原理图与PCB布局要点)

本文详细解析了从UART到RS485的工业级通信转换,重点介绍了SIT3485E收发器的原理图设计、PCB布局要点及抗干扰技巧。通过差分信号传输和优化电路设计,实现长距离、多设备稳定通信,适用于工业自动化等复杂环境。

weixin_29169505的博客 348

memset函数的正确使用(C/C++)

一、用法 memset函数可以将一个数组重置为某个值,比如 char str[16]; memset(str,'a',sizeof(str)); 可以使每个str里的元素值都为’a’ 二、注意 有一点需要注意的是,memeset是以字节为单位重置数组元素的 ...

AI出海日记 2255

《QMT量化实战系列》支持自定义筛选与排序的多因子策略,实测年化收益超100% (1)

公众号推出《QMT量化实战》系列,通过多维度、多策略、多场景讲解QMT量化平台应用,每期附代码解读。本期复现《支持自定义筛选与排序的多因子策略》,策略包含三大核心模块:1. 通过Tushare获取30+财务因子数据;2. 提供灵活筛选机制(支持排除ST股、次新股及特定板块);3. 创新性多因子加权排序系统(支持自定义因子权重组合)。交易逻辑包含动态调仓机制,当持仓标的排名低于阈值时触发卖出。该策略具有高度可配置性,适合不同风险偏好的投资者。(149字)

qq_46262068的博客 1730

memset的用法详解

文章目录memset简介需要说明的几个地方不能任意赋值注意所要赋值的数组的元素类型关于所要赋值的字符数的写法具体用法实例总结 memset简介 memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。 void *memset(void *s, int c, size_t n); s指向要填充的内存块。 c是要被设置的值。 n是要被设置该值的字符数。 返回类型是一个指向存储区s的指针。 需要说明的几个地方 不能任意赋值 memset函数是按照字节对内存块进行初始化,所以不能用它将in

薛定谔的猫的博客 32万+

HTML音乐爱心3D旋转相册完整源码

HTML音乐爱心3D旋转相册完整源码

LilyCoder的博客 1379

【思考模型框架】前景理论(Prospect Theory),认为人们并不是完全理性的决策者,而是根据一些心理上的偏差来评估选项的价值

前景理论,是一种行为经济学理论。前景理论,描述了人们在不确定条件下如何作出决策。前景理论,认为人们并不是完全理性的决策者,而是根据一些心理上的偏差来评估选项的价值。

奶爸的编程之路,也就一周冷个三天 1642

线程管理(二)创建线程池管理线程

为什么要用线程池管理线程?那是因为不停的创建线程是非常耗费资源的的一种方法,所以就需要对它进行管理public class ThreadManager { private ThreadManager() { } private static ThreadManager instance = new ThreadManager(); private static final

noonehide的博客 378

XCP实战系列介绍07-使用ASAP2 Editor生成A2l文件详解

介绍通过ASAP2 Editor工具生成A2l文件步骤详解

initiallizer的博客 7297

线程管理(二)

线程函数参数与返回值 线程函数参数 //注意本程序运行大部分情况下不会输出任何结果 #include <iostream> #include <pthread.h> using namespace std; class InfoPrinted { public: InfoPrinted (char c, int n) : _c (c), _n (n) ...

古渡廊桥 145

模型泛化能力提升:领域自适应与迁移学习

模型泛化能力提升:领域自适应与迁移学习​ ,人工智能,计算机视觉,大模型,AI,在机器学习和深度学习的应用中,模型的泛化能力是一个关键问题。泛化能力指的是模型在新的、未见过的数据上表现良好的能力。然而,实际情况中,训练数据和测试数据往往来自不同的领域,存在分布差异,这会导致模型的泛化能力下降。领域自适应与迁移学习正是为了解决这一问题而发展起来的重要技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

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

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

进程管理(二)——线程

操作系统线程

weixin_43844995的博客 797

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android线程管理(二)——ActivityThread

线程通信、ActivityThread及Thread类是理解Android线程管理的关键。 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用。本小节主要从以下三个方面进行分析: 《Android线程管理...

测试0901-1 309

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

c++多线程thread操作(二)线程管理

线程管理 1. 先看最简单的线程实现案例: void func_1() { cout << "hello linger" << endl; } int main() { thread t1(func_1); // t1 与主线程互不影响 for (int i = 0; i < 10; i++) { // 万一它出现异常就没法join了 cout << "from main:" << i << endl; } t.

BearLeer的博客 1756

ios 多线程开发(二)线程管理

线程管理 iOS和OS X中每一个进程(或程序)由一个或多个线程组成。程序由一个运行main方法的线程开始,中间可以产生其他线程来执行一些指定的功能。 当程序产生一个新线程后,这个线程在程序进程空间内变为一个独立的实体。每个线程有它自己的执行栈。线程可以和其他线程通讯,执行I/O操作,以及其他你想要它做的事。由于他们在同一个进程中,所有一个程序的所有线程共享虚拟内容并且他们和进程有同...

212

RT-Thread 线程管理(二)

在某线程运行完毕,系统将自动删除线程:自动执行rt_thread_exit()函数,先将该线程从系统就绪队列中删除,再将该线程的状态更改为关闭状态,不再参与系统调度,然后挂入rt_thread_defunct僵尸队列(资源未回收、处于关闭状态的线程队列)中,最后空闲线程会回收被删除线程的资源。空闲线程是一个线程状态永远为就绪态的线程,因此设置的钩子函数必须保证空闲线程在任何时刻都不会处于挂起状态,例如rt_thread_delay(),rt_sem_take()等可能会导致线程挂起的函数都不能使用。

Caramel_biscuit的博客 1134

(二)RT-Thread入门——线程管理

RT-Thread是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,也就是允许多个任务同时运行,但是这并不意味着处理器在同一时刻真地执行了多个任务。事实上,这是通过多线程的方式实现的。线程是 RT-Thread 中最基本的调度单位,线程管理线程管理特点线程工作机制线程控制块线程属性线程栈线程状态线程优先级时间片线程入口函数无限循环模式顺序执行或有限次循环模式线程错误码线程状态切换线程操作创建动态线程删除初始化静态线程脱离获得当前线程让出处理器资源睡眠控制线程挂起线程恢复线程设置钩子函数运行代码

weixin_66578482的博客 3223

进程(二)线程管理

进程(二)线程管理 1.为什么使用线程? 进程之间空间之间相互是独立的,进程A不能直接访问进程B的内存空间 如果想要访问就需要操作系统做通讯(开销大) 解决:线程 线程 = 进程的管理功能-共享资源的管理 线程的优点: (1)一个进程中可以同时存在多个线程 (2)各个线程之间可以并发的执行 (3)各个线程之间可以共享地址空间和文件等资源 线程的缺点: 一个线程崩溃,会导致其所属进程的所...

ziggybowie的博客 187

iOS多线程编程指南(二)线程管理

线程管理 Mac OS X和iOS里面的每个进程都是有一个或多个线程构成,每个线程都代表一个代码的执行路径。每个应用程序启动时候都是一个线程,它执行程序的main函数。应用程序可以生成额外的线程,其中每个线程执行一个特定功能的代码。 当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体。每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片。一个线程可以和其他线程或其他

中国iOS开发者协会官方博客 659

C++11线程库 (二) 管理当前线程

命名空间std::this_thread定义了四个管理当前线程的方法: yield 重新安排线程时间片,允许其他程序先执行 void yield() noexcept; get_id 返回当前线程的id std::this_thread::id get_id() noexcept; sleep_for 暂停当前线程执行一段特定时间[1] template< class Rep, class Period > void sleep_for( const std::chrono::

Fishfishfishfishcat 379
上一篇: 线程管理一
下一篇: C和C++的区别一【带有默认值的函数】
IT_model
博客等级 码龄9年 61粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值