pthread笔记

这篇笔记详细介绍了pthread库中的线程创建、退出、同步及互斥锁、条件变量等关键函数的使用,包括pthread_create、pthread_exit、pthread_join、pthread_detach、pthread_cancel等。还探讨了线程的detach状态、调度策略、资源回收等方面,以及如何通过pthread_mutex_t类型的互斥锁和pthread_cond_t类型的条件变量实现线程间的通信和同步。
摘要由CSDN通过智能技术生成
  • 特点:
  1. 有joinable和detached两种类型的线程。joinable(默认)可以被其他线程回收和杀死,但其存储器、资源不会在显式和隐式退出后被回收。detached不可以被回收和杀死,但其资源会在结束后自动回收。
  2. 线程属性可以存在pthread_attr_t类型的变量中,它包含着一个线程可以设置的所有属性,并需要初始化才能使用。同理,互斥锁和条件变量属性使用类pthread_mutexattr_t / pthread_condattr_t。
  3. pthread中大多数产生交互的函数和处理函数都产生返回值,但也可以不获取返回值来使用这些函数(不加n =)。这些返回值大多数以0表示正确执行,或以错误代码表示未能执行的原因。
  4. pthread中线程可以设置以下属性:detachstate(同步状态),schedparam(调用优先级),schedpolicy(调度策略),inheritsched(显式指定调度策略 / 继承调度策略),scope(竞争cpu策略)
  5. pthread的互斥锁是pthread_mutex_t类型的变量。其类型决定了在申请一个已上锁的锁的时候的表现。NORMAL在对锁进行错误操作(unlock未加锁的锁 / lock已经上锁的锁)会导致死锁。ERRORCHECK会返回错误代码。RECURSIVE可以重复上锁并计数。
  6. 要使用条件变量,首先需要由本线程加一把普通锁,在wait产生,线程休眠时会自动解锁,并在条件满足线程继续运行时自动加锁。这是为了方便资源调度通讯以及防止多个线程同时进入等待导致队列错误。

 

    • 1
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    pthread_create() 函数是一个用于创建线程的函数,它的声明在<pthread.h>头文件中。函数的语法格式如下: int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); [1] 通过这个函数,我们可以创建一个新的线程,并指定线程的属性、线程执行的函数以及传递给线程函数的参数。 下面是一个使用pthread_create()函数的样例代码: #include <stdio.h> #include <unistd.h> //调用 sleep() 函数 #include <pthread.h> //调用 pthread_create() 函数 void *ThreadFun(void *arg) { if (arg == NULL) { printf("arg is NULL\n"); } else { printf("%s\n", (char*)arg); } return NULL; } int main() { int res; char * url = "http://www.biancheng.net"; pthread_t myThread1,myThread2; //定义两个表示线程的变量(标识符) res = pthread_create(&myThread1, NULL, ThreadFun, NULL); //创建 myThread1 线程 if (res != 0) { printf("线程创建失败"); return 0; } sleep(5); //令主线程等到 myThread1 线程执行完成 res = pthread_create(&myThread2, NULL, ThreadFun, (void*)url); //创建 myThread2 线程 if (res != 0) { printf("线程创建失败"); return 0; } sleep(5); // 令主线程等到 mythread2 线程执行完成 return 0; } [2] 在这个样例中,我们通过pthread_create()函数成功创建了两个线程,分别是myThread1和myThread2。线程函数ThreadFun用于在线程中执行具体的任务。我们可以通过传递参数给线程函数来定制不同的功能。在这个样例中,我们分别使用NULL和url作为参数传递给线程函数。 通过调用sleep()函数,我们可以让主线程等待子线程的执行完成。这样可以确保线程的执行顺序。 pthread_create()函数可以灵活地创建多个线程,通过指定不同的线程函数和参数,可以实现不同的并发操作。 [3<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【多线程编程学习笔记3】创建线程函数pthread_create()详解](https://blog.csdn.net/qq_41854911/article/details/118718848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值