学习笔记第二十五天

1.wait()

        #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *wstatus);

        定义:wait 函数用于等待子进程结束,并回收子进程的资源。它会阻塞父进程的执行,直到

它的某个子进程结束。

        参数:int *status:指向整数的指针,用于存储子进程的退出状态。如果不需要这个信息,

可以传递 NULL

返回值:成功时,返回被收集的子进程的进程 ID(PID)。

              如果调用进程没有子进程,调用会失败,此时 wait 返回 -1,并设置 errno 为 ECHILD

2.waitpid()

        #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *wstatus);

       pid_t waitpid(pid_t pid, int *wstatus, int options);

        定义:waitpid 函数是 wait 函数的扩展,它允许父进程等待特定的子进程结束,并且提供了

更多的选项来控制其行为。

        参数:pid_t pid:指定要等待的子进程的 PID。特殊值 -1 表示等待任何子进程。

       int *status:与 wait 相同,用于存储子进程的退出状态。

       int options:提供额外的选项来控制 waitpid 的行为。常用的选项包括 WNOHANG(非

阻塞模式)和 WUNTRACED(如果子进程被暂停,则立即返回)。

        返回值:当正常返回时,waitpid 返回收集到的已经回收子进程的进程号。

                     如果设置了 WNOHANG 选项且没有已退出的子进程可等待,则返回 0

                     如果调用中出错(如指定的 PID 不存在或不是调用进程的子进程),则返回 -1,并

设置 errno 以指示错误所在。

3. 线程

        线程是轻量级的进程,是CPU执行的最小单位。与进程相比,线程的创建和调度时空开销更

小,因为它们共享了进程的资源(如代码段、数据段、文件描述符等)。

3.1.为什么需要线程?

        1.资源共享:线程共享进程的资源,这减少了内存和资源的消耗。

        2.高效执行:由于线程的创建和调度开销小,线程能够更高效地执行并发任务。

        3.灵活性:线程允许在单个进程中执行多个任务,这些任务可以并行处理,提高程序的响应速

度和吞吐量。

3.2 线程的组成

        线程ID(tid):唯一标识线程。

        程序计数器:记录线程当前执行的位置。

        寄存器集合:保存线程运行时的上下文信息。

        栈:用于存储局部变量、函数调用等。

3.3 线程与进程的关系

        1.线程存在于进程中。

        2.线程共享进程的代码段、数据段、文件描述符等资源。

        3.线程结束不一定导致进程结束,进程需要等待其所有线程结束后才结束。

3.4 线程的编程

        1.线程的创建:pthread_create() 函数用于创建线程。它需要指定线程ID、线程属性(通常

为NULL表示默认)、线程执行函数(回调函数)以及该函数的参数。

        2.线程的执行:体现在线程的执行函数(回调函数)上。每个线程都有自己的执行流,可以独

立执行不同的任务。

        3.线程的退出:pthread_exit():用于结束当前线程,并可以指定退出状态值。线程也可以在

执行完其执行函数后自然退出。

        4.线程的资源回收:pthread_join():用于等待指定的线程结束,并可以获取该线程的退出状

态值。这有助于父线程同步子线程的执行结果。

        如果线程被设置为分离属性(detach),则系统会在线程结束时自动回收其资源,无需父线程显式等待。

4. pthread_create()

函数原型:

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

功能:该函数用于创建一个新的线程,该线程将执行由 start_routine 指定的函数。

参数:thread:指向 pthread_t 类型的指针,用于存储新创建的线程的标识符(ID)。

   attr:指向 pthread_attr_t 类型的指针,用于指定线程的属性。如果传递 NULL,则使用默

认属性。

    start_routine:线程将要执行的函数的指针。这个函数必须接受一个 void* 类型的参数,

并返回一个 void* 类型的值。

   arg:传递给 start_routine 函数的参数。

返回值:成功时返回 0。失败时返回错误码。

5. pthread_exit()

函数原型:

void pthread_exit(void *retval);

功能:该函数用于终止调用它的线程。如果线程是通pthread_create() 创建则 pthread_exit() 会

导致该线程结束执行,并返回一个指向 retval 的指针,该指针指向的值可以被其他线程通

过 pthread_join() 调用获取。

 

参数:retval:一个指向 void 的指针,用于传递线程的退出状态或返回值。如果不需要返回值,

可以传递 NULL

注意:如果 pthread_exit() 在主线程(即调用 main() 函数的线程)中被调用,并且该进程中有其

他线程在运行,则主线程的终止不会导致整个进程的终止。进程将在所有其他线程都终止后才结

束。

        如果 pthread_exit() 在非主线程中被调用,则该线程将终止,并释放其资源。

6. pthread_join()

函数原型:

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

功能:该函数用于等待指定的线程结束。调用该函数的线程(通常是主线程或其他线程)将被阻

塞,直到指定的线程结束。

参数:thread:要等待的线程的标识符(ID)。

   retval:一个指向 void** 的指针,用于接收被等待线程的退出状态或返回值。如果不需要

接收退出状态,可以传递 NULL

返回值:成功时返回 0。失败时返回错误码。

注意:如果 thread 指定的线程已经结束,pthread_join() 将立即返回。

          如果 thread 指定的线程是调用 pthread_join() 的线程自身,则行为是未定义的。

          线程在创建时可以被设置为分离状态(通过线程属性),如果线程是分离的,则不能

被 pthread_join() 等待。在这种情况下,线程结束时其资源会自动被回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值