相关文章

【操作系统原理】页面置换算法模拟

【操作系统原理】信号量的应用

【操作系统原理】进程的管道通信

【操作系统原理】进程调度模拟

【操作系统原理】进程创建与控制

原理

1Pthread_create函数

创建一个新的线程,其功能对应进程中的fork函数,如果成功返回0,不成功返回一个错误的号码

函数原型:pthread_create(pthread_t *thread,pthread_attr_t *attr,void*(*start_routine)(void *),void *arg):

第一个参数,参数类型为pthread_t类型,用于接收创建新的线程的id

第二个参数,参数类型为pthread_attr_t类型,用于设置线程的属性,一般设置为NULL,表示使用线程默认属性sfw。

第三个参数,参数类型为函数指针,用于设置线程的主函数,当pthread_create函数返回时,则会自动调用指定的函数,当指定的函数运行完后,则线程就结束了

第四个参数,设置线程主函数的参数,如果没有这设置为NULL

2Pthread_join函数

等待执行的线程,并接受子进程返回的状态

函数原型:int pthread_join(pthread_t thread, void ** retval)

1)参数pthread_t thread为主线程需要等待的指定线程

2)参数retval用于接收对应线程结束状态(如果不接收,则设置为NULL)

3、Pthread_self函数:

获取当前线程的id,其返回值为Pthread_t类型(线程id类型)

   函数原型:pthread_t  pthread_self(void) 获取线程身份的id号

4、Pthread_key_create函数:

创建线程私有数据pthread_key_t结构

函数原型:int  pthread_key_create(pthread_key_t *key, void(*destructor)(void*))创建线程私有数据

   第一个参数为需要实例的pthread_key_t变量

第二个参数是销毁函数,此参数是可选的,当为NULL则系统调用默认的销毁函数进行相关数据的销毁,如果不为NULL,则在线程退出的时候,key关联的数据作为参数,传入到指定的销毁函数并调用,最后释放分配的缓冲区或关闭文件流等的释放操作

   此处的pthread_key_t结构,可以理解为各个线性中,同名但内容不同的变量

5、pthread_key_delete函数:

注销线程中的私有数据

函数原型:int  pthread_key_delete(pthread_key_t key) 销毁指定的pthread_key_t变量

6、pthread_setspecific函数

写线程私有数据

7、pthread_getspecific函数

读线程私有数据

函数原型void pthread_getspecific(pthread_key_t key) :读取当前线程获取对应所持有pthread_key_t变量中的内容

   第一个参数为指定需要内容的pthread_key_t变量

   此处需要注意,如果pthread_key_t变量的内容为空,则会返回0(NULL)

下图为采用Pthreads API的C语言多线程程序示例:

过程与结果

1、在main函数中创建两个子线程,两个子线程的函数为child1和child2

main函数创建两个子进程

child1、child2执行函数

2、在两个子线程函数中分别输出两个子线程id,并在child2中定义一个私有变量a=(学号后3位),修改线程私有变量为a=(19+学号后3位)

创建私有变量a并修改输出

pthread_getpecific和pthread_setspecific提供了在同一个线程中不同函数间共享数据即线程存储的一种方法。具体用法为:

(1)调用pthread_key_create()来创建一个类型为pthread_key_t类型的变量

该函数有两个参数,第一个参数就是声明的pthread_key_t变量;

第二个参数是一个清理函数,用来在线程释放该线程存储的时候被调用。

该函数指针可以设成NULL,这样系统将调用默认的清理函数。

(2)调用pthread_setspcific()

当线程中需要存储特殊值的时候调用该函数,该函数有两个参数,

第一个为前面声明的pthread_key_t变量,

第二个为void*变量,用来存储任何类型的值。

(3)如果需要取出所存储的值,调用pthread_getspecific()

该函数的参数为前面提到的pthread_key_t变量,该函数返回void*类型的值。

3、在main函数中,要求main函数等待两个子线程的结束,注销线程的私有的数据。

子进程的结束

判断线程私有数据是否使用pthread_key_delete()注销删除

pthread_key_delete()销毁线程特定数据键。由于键已无效,因此将释放与该键关联的所有内存。在调用该函数之前必须释放所有线程的特定资源,‘

函数不会调用任何析构函数。反复调用pthread_key_create与pthread_key_delete可能会产生问题。对于每个所需的键,应当只调用pthread_key_create与pthread_key_delete各一次。

代码

执行结果

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐