
多线程编程
一,线程的基本概念
与进程相比,多线程是一种非常节俭的多任务操作. 在linux操作系统下,必须启动一个新进程
它分配独立的地址空间并建立大量数据表以维护其代码段,堆栈段和数据段,这是一种“昂贵的”多任务处理
工作方法;在一个进程中运行多个线程时,它们彼此使用相同的地址空间,共享大部分数据,然后启动一个线程
线程占用的空间比启动进程所需的空间小得多,线程之间切换所需的时间也远小于进程之间的切换
所需时间.
作为一个独立的实体,进程为运行线程提供资源,并构成一个静态环境. 线程是处理器调度的基本单位. 如果
进程的概念描述了单机操作系统的行为,线程的概念描述了多机系统的并行处理.
多线程工作提供了线程之间的便捷通信机制. 因为数据空间是在同一进程之间的线程之间共享的,所以一行
程序的数据可以被其他线程直接使用c语言多线程编程,这不仅快速而且方便.
多线程程序还具有以下优点: 改善应用程序响应,使CPU系统更有效,并改善程序结构.
第二,线程实现
Linux系统下的多线程遵循称为PTHREAD的POSIX线程接口. 要在Linux下编写多线程程序,您需要使用头文件
pthread.h,您需要使用库文件libpthread.a. (因此您需要添加选项: -lpthread进行编译)
(1)创建一个线程: 即确定调用该线程函数的入口点,常用的函数是pthread_create.
原型:
int pthread(pthread_t * thread, pthread_attr_t * attr, void * ( * start_routine) (void *), void arg)); pthread: 线程标识符 attr: 线程属性 start_routine:线程运行函数的起始地址(线程函数名) arg:运行函数的参数(线程函数所需的参数) 返回值:创建成功——返回0,若不为0则为创建线程失败(EAGAIN,EINVAL)
(2)线程挂起
一个进程中的多个线程共享数据段,因此通常程退出后,退出线程占用的资源将不会跟随
程终止时释放. 就像进程中的wait()一样,程之间使用pthread_join()函数来挂起当前线程并等待.
线程结束. pthread_join()是一个线程阻塞的函数,调用它的函数将一直等到等待线程结束.

请注意,一个线程不能由多个线程等待c语言多线程编程,否则第一个接收信号的线程将成功返回,其余线程将
返回错误代码.
原型:
int pthread_join(pthread_t th, void ** thread_return); th: 被等待的线程标识符 thread_return:用户定义的指针,用于存储被等待线程的返回值
(3)线程结束: 1.相关线程功能的操作结束; 2.调用pthread_exit()函数
原型:
void pthread_exit(void * retval) retval:函数的返回代码,即thread_return
示例:
void thread(void){}//线程运行函数
pthread_t id;
pthread(&id,NULL,(void *)thread,NULL);
//创建线程,第一个NULL —— 生成默认属性的线程,第二个NULL —— 线程运行函数不需要参数
pthread_join(id,NULL);//挂起线程
三,修改线程属性
thread属性的值不能直接设置,需要调用相关函数进行操作,初始化函数为pthread_attr_init,此函数
必须在pthread_create函数之前调用数字. 属性对象包括是否绑定,是否分离,堆栈地址,堆栈大小和优先级.
默认属性是未绑定,未分离的,默认1MB堆栈,并且具有与父进程相同的优先级. 对于大多数程序,请使用默认值
识别属性就足够了.
1,绑定
关于装订涉及另一个概念: 轻量工艺LWP(轻量工艺). 可以理解为内核线程,系统到线程
资源分配和线程控制是通过轻量级进程实现的. 默认情况下,系统控制要启动多少个灯光过程以及要进入哪个灯光
该过程控制哪些线程. 此状态称为未绑定. 绑定是指某个线程固定地“绑定”到轻线程. 装订线工具
响应速度更高(CPU时间片的调度是针对轻量级进程的. )
通过设置绑定光进程的优先级和调度级别,绑定线程可以满足实时响应等要求
创建绑定线程: (pthread_attr_setscope)
pthread_attr_t attr; pthread_t tid; pthread_attr_init(&attr);//初始化属性值,均设为默认值 pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);//设置绑定状态 pthread_create(&id, &attr, (void *) my_function, NULL); attr: 指向属性结构的指针 绑定类型:PTHREAD_SCOPE_SYSTEM(绑定的),PTHREAD_SCOPE_PROCESS(非绑定的)

2. 分离
线程的分离状态决定了线程如何终止自身.
非分隔: 原始线程等待创建的线程的结尾,并且仅在pthread_join()函数返回时释放占用的资源.
分离: 不等待其他进程,运行后立即释放占用的资源.
线程分离状态的功能:
pthread_attr_setdetachstate(pthread_attr_t * attr, int detachstate) detachstate: PTHREAD_CREATE_DETACHED(分离线程), PTHREAD_CREATE_JOINABLE(非分离线程)
如果将一个线程设置为单独的线程,并且该线程运行非常快,则可能在pthread_create函数中
它在返回之前终止,因此调用pthread_create的线程可能获得错误的线程号. 为避免这种情况,
通常在创建的线程中调用pthread_cond_timewait函数,以使该线程等待一段时间.
3. 优先级
使用函数pthread_attr_getschedparam和pthread_attr_setschedparam将优先级存储在sched_param结构中
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-168041-1.html
晚安
芝麻糊还有肉末
好事情啊