linux多线程编程学习笔记(1)

1)系统调用

1.1)创建线程

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

(1)第一个参数用来存储线程ID,参数为指向线程ID的指针,线程的ID在某个进程中是唯一的。如果创建成功,在此参数中返回新线程ID;如果设置为NULL,则不会返回生成的线程的标识值。
(2)第二个参数用来设置线程属性,主要设置与栈相关的属性。一般情况下,此参数设置为NULL,新的线程将使用系统默认的属性。
(3)第三个参数是线程运行的代码起始地址,即在次线程中运行哪段代码。
(4)第四个参数是运行的参数地址。如果需要传入多个参数,则需要使用一个包含这些参数的结构体地址。
/// 此函数如果执行成功,将返回0,如果失败,将返回非0值。

1.2)线程退出

void pthread_exit(void *retval);

使用pthread_exit库函数调用可以结束一个线程,其结束方式与进程调用exit()函数类似。

1.3)等待线程

int pthread_join(pthread_t thread, void **retval);

此函数将阻塞态调用当前线程的线程,直到此线程退出。当函数返回时,处于被等待状态的线程资源被回收。
(1)第一个参数为被等待的线程ID,此线程必须同调用它的进程相联系,而不能是独立的线程,默认情况下线程为关联线程。
(2)第二个参数为一个用户定义的指针,指向一个保存等待线程的完整退出状态的静态区域,它可以用来存储被等待
线程的返回值。
/// 此函数如果执行成功将返回0,当该线程终止时,系统将自动收回它的资源;如果执行失败,将返回非零值。

1.4)独立线程

int pthread_detach(pthread_t thread);

设置某个线程为独立线程,由系统来回收线程所占用资源。

1.5)线程退出前操作

void pthread_cleanup_push(void (*routine)(void *), void *arg);

(1)参数void routine(void *arg)在调用pthread_cleanup_push()时压入清理函数栈,多次调用pthread_cleanup_push()将在清理函数栈中形成一个函数链,在执行该函数链时按照压栈的相反顺序弹出。

void pthread_cleanup_pop(int execute);

(1)参数execute表示执行到pthread_cleanup_pop时,是否在弹出清理函数的同时执行该函数,为0表示不执行;非0为执行。这个参数并不影响异常终止时清理函数的执行。

1.6)取消线程

int pthread_cancel(pthread_t thread);

请求取消执行线程。仅当目标线程的可取消状态为PTHREAD_CANCEL_ENABLE时,才可进行取消。

2)基本概念

线程状态
就绪:线程能够运行,但在等待可用的处理器。可能刚刚启动,或刚刚从阻塞中恢复,或者被其他线程抢占
运行:线程正在运行。在多处理器系统中,可能有多个线程处于运行状态
阻塞:线程由于等待处理器外的其他条件无法运行,如条件变量的改变、加锁互斥量或I/O操作结束

终止:线程从起始函数中返回,或调用pthread_exit,或者被取消,终止自己并完成所有资源清理工作。不是被分离,被也不是连接,一旦线程被分离或者连接,它就可以被回收


2.1)创建线程

  进程的初始线程随着进程的创建而创建。其他线程通过显示的函数调用建立,Pthreads系统中建立线程的主要方式是调用pthread_create。在新线程建立后,它处于就绪态。受调度机制的限制,新线程可能在就绪态停留一段时间后才被执行,运行函数的线程在调用pthread_create时就处于就绪态。在当前线程从函数pthread_create中返回以及新线程被调度执行之间不存在同步关系。即,新线程可能在当前线程从pthread_create返回之前就运行了。

2.2)线程启动

  一旦线程被创建,最终它将开始执行机器指令。初始指令序列将导致在pthread_create调用中指定的线程启动函数的执行。main函数的调用参数与普通线程的启动参数不同。另一方面,如果普通线程从启动函数中返回,则线程终止而其他线程依然可以运行;但初始进程从main函数中返回,进程和进程内所有线程也被终止。在大多数系统中,初始线程运行在默认进程堆栈上,该堆栈可以增长到足够的尺寸;而在某些现实中,普通线程的堆栈空间是受限的,如果线程堆栈溢出,则程序会因段错误或总线错误而失败。

2.3)运行和阻塞

  大多数线程会不时地睡眠休息。线程之所以会休眠是因为它需要的某个资源不可用(即被阻塞),或者因为系统将处理器分配给其他线程(即被抢占)。线程在以下情况时被阻塞:试图加锁一个已经被锁住的互斥量;等待某个条件变量;等待Singwait等待未发生的信号;执行无法立即完成的I/O操作。线程还会由于如内页错误之类的操作系统操作而被阻塞。

2.4)终止

  线程通常从启动函数中返回来终止自己。当调用pthread_exit退出线程或者调用pthread_cancel取消线程时,线程在调用完每个清理过程后也将进入终止态。

3)参考文献

《Linux高级程序设计》
《POSIX多线程程序设计》


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值