线程控制与分离


线程: 在一个进程的地址空间中执行多个线程 ---- 强调共享

 线程是进程中的一个实体。

线程私有: 线程id

上下文信息 (包括各种寄存器的值、程序计数器和栈指针)

(私有)栈空间    errno变量    信号屏蔽字    调度优先级

此时:POSIX标准   编译时  加上 -lpthread



线程与进程的区别:

1、进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位;

线程是进程的一个实体。

2、进程 强调 独占,线程 强调 共享。

3、线程私有【 线程id

上下文信息 (包括各种寄存器的值、程序计数器和栈指针)

(私有)栈空间    errno变量    信号屏蔽字    调度优先级 】

4、二者均可并发执行。

一、线程控制:

1、创建线程:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine) (void *), void *arg);

//参数:线程 id,线程 属性,线程 状态,线程 参数

//返回值:成功 0;失败 错误码

2、等待线程:

int pthread_join(pthread_t thread, void **retval); //参数:线程 id,返回值

3、终止线程:

1)从线程函数内部 return 结束  //value_ptr指向的存放:return 返回值

2)从线程函数调用 pthread_exit()函数      //value_ptr指向的存放:pthread_exit 参数

void pthread_exit(void *retval);

3)线程被取消 pthread_cancel()

int pthread_cancel(pthread_t thread); //value_ptr指向的存放:PTHREAD_CANCELED (-1)

pthread_t pthread_self(void); //线程id

实例:

//my_thread.c

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

void *thread_run(void *arg)
{
//      sleep(10);
	int count=5;
	while(count-- > 0)
	{
		printf("this is thread,Code: %d\n",pthread_self());
		sleep(1);
	}
//	return (void*)1; //终止线程1:return
//	pthread_exit((void*)2); //终止线程2:pthread_exit
        return NULL; //终止线程3:pthread_cancel
}
int main()
{
	pthread_t tid; //主线程
	int ret=pthread_create(&tid,NULL,thread_run,NULL); //创建线程
	int count=10;
	while(count-- > 0)
	{
		printf("This is Main-Thread,Code: %d\n",pthread_self());
		sleep(1);
	}
	pthread_cancel(tid); //终止线程3:pthread_cancel

	void *status=0;
	ret=pthread_join(tid,&status);
	if(ret == 0)
	{
		printf("thread is success,Code: %d\n",(int)status);
	}

	return 0;
}

运行结果:

终止线程:

总结:

终止进程的三种方法运行结果大体相同,但返回值不同,return 的返回值和exit的参数及PTHREAD_CANCELED (值为-1)。

二、线程分离:  线程的一种属性

线程是可结合的(joinable)或者是分离的(detached)。

由于调用pthread_join后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。这时可以在 子线程中加入代码     pthread_detach(pthread_self())

或者 父线程调用    pthread_detach(thread_id)(非阻塞,可立即返回)。

这将该子线程的状态设置为分离的,这样一来,该线程运行结束后会自动释放所有资源。

//thread_detach.c

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

void* thread1(void *arg)
{
	int count=5;
	while(count-- > 0)
	{
		printf("this is thread1:%d,thread_t:%u\n",(int)arg,pthread_self());
		sleep(1);
	}
	return (void*)1;
}

void* thread2(void *arg)
{
	int count=5;
	while(count-- > 0)
	{
		printf("this is thread2:%d,thread_t:%u\n",(int)arg,pthread_self());
		sleep(1);
	}
	pthread_exit((void*)2);
}

void* thread3(void *arg)
{
	int count=5;
	while(count-- > 0)
	{
		printf("this is thread3:%d,thread_t:%u\n",(int)arg,pthread_self());
		sleep(1);
	}
	return NULL;
}

int main()
{
	pthread_t tid1,tid2,tid3;
	pthread_create(&tid1,NULL,thread1,(void*)1);
	pthread_create(&tid2,NULL,thread2,(void*)2);
	pthread_create(&tid3,NULL,thread3,(void*)3);
	sleep(2);
	pthread_cancel(tid3);
	pthread_detach(tid1);

	void *ret=NULL;
	int res=pthread_join(tid1,&ret);
	printf("tid1 return,res:%d\n",res);
	res=pthread_join(tid2,&ret);
	printf("tid2 pthread_exit,res:%d\n",res);
	res=pthread_join(tid3,&ret);
	printf("tid3 pthread_cancel,res:%d\n",res);

	return 0;
}

运行结果:

时间: 2024-08-02 11:03:56

线程控制与分离的相关文章

Linux之线程:控制与分离

之前我一直都提到的是进程,现在多了一个线程的概念,从字面意思来看,线程应该比进程小.嘿嘿. 其实操作系统刚开始的时候,提出进程概念后,操作系统一直都是以进程作为独立运行的基本单位,然后有人感觉了,这不对呀,进程之间的中断转换太浪费了,并且用户态到核心态的切换也有点麻烦,所以在80年代中期,人们又提出了毕竟更小的独立运行的基本单位咯--线程,用来提高系统内存程序的并发执行程度.所以线程就这么出现了. 那,什么是线程呢? 其实简单来说,线程就是进程中的执行分流,从操作系统内部来说其实就是一个指令序列

Linux下线程的控制与分离

一.线程的概念: 线程是运行在进程地址空间的,是进程的执行分流.它是执行进程内部的一个代码片段为了让进程更好的完成.也可以说,进程是承担系统资源的实体,而线程进程运行调度的基本单位. 由于同一进程的多个线程共享同一地址空间,因此Text Segment.Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境: 1. 文件描述符表 2. 每种信号的处理方式(SIG_IGN.SIG_DFL或者

线程的控制和分离

线程的概念:线程是运行在进程内的一个基本执行流,和进程共享地址空间及资源(类似于父子进程共享地址空间),但每个也有自己的私有资源. 进程强调独占性 每个进程都有它独立的地址空间,包括Text Segment.Data Segment等 线程强调共享性 线程的共享资源: 1.进程代码段 2.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯) 3.进程打开的文件描述符 4.信号的处理器 5.进程的当前目录和进程用户ID与进程组ID 线程的私有资源:(线程实现并发性)       1

linux线程控制&amp;线程分离

线程概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 线程资源 由于一个程序中的多个线程共享同一地址空间,因此代码段,数据段内容是共享的.除此之外,以下内容也是共享的: 1. 文件描述符表2. 每种信号的处理方式(SIG_IGN.SIG_DFL

.NET线程控制快速学习01

最近,由于基础框架的整体升级,因此需要更新所有相关项目的DLL文件.这个过程存在不小的风险,因此也对发布后的生产服务器进行了密切的监控,结果还是出现了个别应用出现异常的情况,很快的占用了大量的服务器内存和CPU等资源.通过研究dump,初步发现是由于配置服务器出现单点故障,然后应用通过多线程调用相关SOA服务时出现异常,引发了ThreadAbortException异常,而且由于原有异常处理代码不够严谨,而且与异步发送报警邮件紧密结合在一起,造成线程数量的几何级增加,最终使得整个服务器不可用.这

线程基础--线程控制

3.  线程控制 1). 线程属性 目标:可以设置 线程的 detached/join 状态,线程栈的大小和最低地址等属性. detached/join 状态的区别: 当线程处于 分离状态(detached)时,线程结束时,os立即回收资源.主线程不可以调用pthread_join获取线程退出时的返回值. 当线程处于 未分离状态(join)时,线程结束时,主线程 调用pthread_join获取线程退出时的返回值, 随后释放该线程资源. a)数据类型 pthread_attr_t b)初始化及释

Linux/UNIX线程控制

线程控制 线程属性 调用pthread_create函数的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结果的指针.可以用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来.可以使用pthread_attr_init函数初始化pthreaad_attr_t结构.调用pthread_attr_init以后,pthread_attr_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值.如果要修改其中个别属性的值,需要调用其他的函数.pt

Linux之线程、线程控制、线程属性

一.整体大纲 二.线程相关 1. 什么是线程    LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB 线程:也有PCB,但没有独立的地址空间(共享) 区别:在于是否共享地址空间. 独居(进程):合租(线程). Linux下: 线程:最小的执行单位 进程:最小分配资源单位,可看成是只有一个线程的进程. 2. Linux内核线程实现原理     (1)线程实现原理 类Unix系统中,早期是没有“线程”概念的,80年代才

第10章 线程控制(2)_线程属性和线程优先级

3. 线程属性 3.1 线程属性结构体 (1)pthread_attr_t结构体 (2)线程属性初始化和销毁 头文件 #include <pthread.h> 函数 int pthread_attr _init(pthread_attr_t* attr); //初始化 int pthread_attr_destroy(pthread_attr_t* attr); //销毁 返回值 成功返回0,否则返回错误编号 3.2 设置和获取分离属性 头文件 #include <pthread.h&g