线程属性
线程属性
线程
ps : 这个线程属性这个真没理解透彻, 也没有找到合理的解释, 所以也不知道怎么解释, 自己感觉直到一些, 却又不知道怎么表达正确, 所以我就尽量写书上的, 而且我也不打算都写, 就里出来一些, 如果是想参考的话, 这一篇就算了吧. 感觉没有任何帮助的.
关于线程的属性 :
- 每个对象与它自己类型的属性对象进行关联. 一个属性对象可以代表多个属性.
- 可调用初始化函数, 把属性设置为默认值.
- 最后要掉用销毁属性对象的函数.
线程属性的默认值对象 :
typedef struct
{
int detachstate; 线程的分离状态
int schedpolicy; 线程调度策略
struct sched_param schedparam; 线程的调度参数
int inheritsched; 线程的继承性
int scope; 线程的作用域
size_t guardsize; 线程栈末尾的警戒缓冲区大小
int stackaddr_set;
void * stackaddr; 线程栈的位置
size_t stacksize; 线程栈的大小
}pthread_attr_t;
分配 :
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr) // 初始化, 分配
int pthread_attr_destroy(pthread_attr_t *attr) // 销毁, 反初始化
// 成功, 返回 0; 失败, 返回错误编码
// 静态初始化
pthread_attr_t t = PTHREAD_CREATE_DETAHED
获取线程属性
#include <pthread.h>
// 获得线程属性
int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr, int *detachstate)
int pthread_attr_setdetachstate(pthread_attr_t *attr, int *detachstate)
// 成功, 返回 0; 失败, 返回错误编码
互斥量
- 允许相
互独立的多个进程把同一个内存数据块映射到他们各自独立的地址空间中.- 如果进程共享互斥量属性设置为PTHREAD_PROCESS_SHARED, 从多个进程彼此之间共享的内存数据块中分配的互斥量就可以用于这些进程的同步.
#include <pthread.h>
// 得到共享属性
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr, int *restrict pshared)
// 设置共享属性
int pthread_mutexattr_setpshared(pthread_mutexattr_t *restrict attr, int pshared)
ps : 没有想到例子, 不知道怎么写了, 毕竟没有例子就说明没有掌握, 我也不打算再写函数了.
我直接写一些较重要的点吧
整理
- 线程特定数据数存储和查询某个特定线程相关数据的一种机制.
-
- 希望每个线程可以访问它自己单独的数据副本, 而不需要担心与其他线程的同步访问问题.
-
- 相关的就像是数据在内存的映射关系.
- 线程的取消并不是调用函数取消就会立即的取消
-
- 当线程收到取消的请求还会继续的执行, 直到执行到取消点, 线程才会被取消
- 线程中的屏蔽字
-
- 每个线程都有自己的信号屏蔽字, 但是信号的处理是进程中所有线程共享的.
-
- 进程中的信号是递送到单个线程的.
- 锁与创建子进程
-
- 如果父进程在进程中的线程占有锁, 子进程就同样占有这些锁. 所以应该在fork()之前应该清理锁的状态
-
- 如果fork()之后立即调用exec()函数, 子进程就同样占有锁了.
-
- 清除锁可以通过pthread_atfork()函数建立fork处理程序.
#include <pthread.h>
// prepare : 获取锁
// parent : 释放锁
// child : 在fork()之前调用, 释放子锁
int pthread_atfork(void (* prepare)(void), void (* parent)(void), void (*child)(void))
// 成功, 返回 0; 失败, 返回错误编码