APUE:线程,线程控制

线程标识

pthread_t pthread_self (void);
int pthread_equal (pthread_t __thread1, pthread_t __thread2);

创建、退出、等待、取消线程

int pthread_create (pthread_t *__restrict __newthread, const pthread_attr_t *__restrict __attr, void *(*__start_routine) (void *), void *__restrict __arg);
void pthread_exit (void *__retval);

// 等待线程结束
int pthread_join (pthread_t __th, void **__thread_return);

// 分离线程
int pthread_detach (pthread_t __th);

// 请求线程取消
int pthread_cancel (pthread_t __th);

线程属性

enum
{
  PTHREAD_CREATE_JOINABLE,
  PTHREAD_CREATE_DETACHED
};

int pthread_attr_init (pthread_attr_t *__attr);
int pthread_attr_destroy (pthread_attr_t *__attr);

// 分离状态
int pthread_attr_getdetachstate (const pthread_attr_t *__attr, int *__detachstate);
int pthread_attr_setdetachstate (pthread_attr_t *__attr, int __detachstate);

// 自定义栈
int pthread_attr_getstack (const pthread_attr_t *__restrict __attr, void **__restrict __stackaddr, size_t *__restrict __stacksize);
int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, size_t __stacksize);

// 自定义栈大小
int pthread_attr_getstacksize (const pthread_attr_t *__restrict __attr, size_t *__restrict __stacksize);
int pthread_attr_setstacksize (pthread_attr_t *__attr, size_t __stacksize);

// 扩展栈大小(警戒区)
int pthread_attr_getguardsize (const pthread_attr_t *__attr, size_t *__guardsize);
int pthread_attr_setguardsize (pthread_attr_t *__attr, size_t __guardsize);

  

可重入和线程安全

  • 线程安全:多个线程可以同时的、安全的调用同一个函数
  • 重入:例如 main() 调用 malloc() 时产生信号,中断原有流程,进入信号处理函数,信号处理函数中再次调用 malloc(),称为重入。从栈帧上说,malloc() 出现了多次。此时调用 malloc() 显然有问题,比如可能会破坏原有分配链表,可能会导致程序崩溃,所以 malloc() 是不可重入的。
  • 可重入函数肯定是线程安全的,但线程安全不一定可重入,malloc() 就是一个线程安全不可重入的例子。

线程特定数据(线程私有数据)

时间: 2024-10-20 18:48:25

APUE:线程,线程控制的相关文章

(九) 一起学 Unix 环境高级编程 (APUE) 之 线程

. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)

线程的控制与分离

线程的控制 线程的创建: 线程创建函数:int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine(void*),void *arg); 返回值:成功返回0,失败返回错误号. 在一个线程中调用pthread_create()创建新的线程后,当前线程从pthread_create()返回继续往下执行,而新的线程所执行的代码由我们传给pthread_create()的函数指针star_ro

Linux - 线程属性控制

线程属性 属性值不能直接设置,须使用相关函数进行操作 初始化函数为pthread_attr_init,该函数必须在pthread_create函数之前调用 typedef struct{ int detachstate; // 线程的分离状态 int scope; // 线程绑定状态 int schedpolicy; // 线程调度策略 struct sched_param schedparam; // 线程的调度参数 int inheritsched; //线程的继承性 size_t guar

java中线程的控制

线程的控制: Java中的线程支持提供了一些便捷的工具方法,通过这些便捷的工作方法可以更好的控制线程的执行. 一.join线程: Thread提供了让一个线程等待另一个线程完成的方法——join()方法.当某个程序执行流中调用其他线程的join方法时,调用线程将被阻塞,直到被join方法加入的join线程执行完为止. Join()方法有如下3种重载形式: 1.join():等待被join的线程执行完成. 2.join(long millis):等待被join的线程的时间最长为millis 毫秒,

Java多线程之线程的控制

Java多线程之线程的控制 线程中的7 种非常重要的状态:  初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dead 如果将"锁池"和"等待队列"都看成是"阻塞"状态的特殊情况,那么可以将线程归纳为5个状态: 新建,就绪,运行,阻塞,死亡. ┌--------------------< 阻塞 ↓                    (1)(2)(3)  

【APUE】线程与信号

每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的.进程中的信号是递送到单个线程的. 线程中pthread_sigmask函数类似与进程的sigprocmask函数,可以用来阻塞信号. #include <signal.h> int pthread_sigmask(int how,const sigset_t *set,sigset_t *obset); 线程可以通过调用sigwait等待一个或多个信号发生. #include <signal.h> int sigw

(六) 一起学 Unix 环境高级编程(APUE) 之 进程控制

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 上一篇博文中我们讨论了进程环境,相信大家对进程已经有了初步的认识

死锁现象与解决方案,开启线程的2种方式,守护线程,线程VS进程,线程互斥锁,信号量

死锁现象与解决方案 from threading import Thread,Lock,active_count import time mutexA=Lock() # 锁1 mutexB=Lock() # 锁2 class Mythread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('%s 拿到A锁' %self.name) mutexB.acquire() print('%

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im

C#线程 线程进阶

第四部分:高级线程 非阻塞同步 前面我们说过,即使在分配或增加字段的简单情况下,也需要同步.尽管锁定始终可以满足此需求,但是竞争性锁定意味着线程必须阻塞,从而遭受上下文切换的开销和调度的延迟,这在高度并发且对性能至关重要的情况下是不希望的. .NET Framework的非阻塞同步结构可以执行简单的操作,而无需阻塞,暂停或等待. 正确编写非阻塞或无锁的多线程代码非常棘手!特别是,内存障碍很容易出错(volatile关键字甚至更容易出错).在解除普通锁之前,请仔细考虑是否真的需要性能优势.请记住,