ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【学习笔记】线程概念及相关函数全总结

2021-11-04 17:30:39  阅读:164  来源: 互联网

标签:线程 函数 笔记 mutex pthread cond sem


线程

线程的概念

由于同一进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:

1.文件描述符表

2.每种信号的处理方式

3.当前工作目录

4.用户id和组id

但有些资源是每个线程各有一份的:

1.线程id

2.上下文,包括各种寄存器的值、程序计数器和栈指针

3.栈空间

4.errno变量

5.信号屏蔽字

6.调度优先级

在Linux上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项。


线程控制

pthread_create

  • 函数原型:

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

pthread_t *thread:用来接收返回的线程号

pthread_attr_t *attr:线程属性,一般可设置为NULL

void *(*start_routine) (void *):入口函数指针

void *arg:函数参数指针

返回值:成功返回0,失败返回errorno


pthread_self

  • 函数原型:

pthread_t pthread_self(void);

返回值:该线程的线程号


pthread_cancel

  • 功能:发送终止信号给thread线程
  • 函数原型:

int pthread_cancel(pthread_t thread)

pthread_t thread:发送终止信号的线程

返回值:如果成功则返回0,否则为非0值


pthread_exit

  • 功能:退出当前线程

  • 函数原型:

void pthread_exit(void *retval);

void *retval :线程所调用函数返回值


pthread_join

  • 功能:挂起等待直到该线程终止

  • 函数原型:

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

pthread_t thread:线程号

void **retval:线程所调用函数返回值,如果不感兴趣可传空

返回值:成功返回0,失败返回errorno


pthread_detach

  • 功能:使线程分离,分离的线程结束后自动释放所有资源。

  • 函数原型:

int pthread_detach(pthread_t thread);

pthread_t thread:需要分离的线程

返回值:成功返回0,失败返回errorno


线程同步

锁的类型

  1. 互斥锁(mutex)
  2. 自旋锁
  3. 读写锁
  4. 条件锁

互斥锁

mutex变量

  • pthread_mutex_t mutex = PTHREAD_MUTEX_INIALIZER

  • 如果mutex是静态分配的,可用上述宏定义PTHREAD_MUTEX_INITIALIZER来初始化,相当于用pthread_mutex_init初始化并且attr参数为NULL。


pthread_mutex_init

  • 函数原型:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutex‐attr);

  • 函数功能:初始化锁且设置属性

  • pthread_mutex_t *mutex:待初始化的锁

  • const pthread_mutexattr_t *mutex‐attr:锁的属性。一般设置为NULL,如果要将其定义为进程之间可以持有的互斥锁,则需要传入属性对象地址。

  • 返回值:成功返回0,失败返回错误号


pthread_mutex_destroy

  • 函数原型:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

  • 函数功能:销毁锁
  • pthread_mutex_t *mutex:销毁锁
  • 返回值:成功返回0,失败返回错误号

pthread_mutex_lock

  • 函数原型:

int pthread_mutex_lock(pthread_mutex_t *mutex);

  • 函数功能:阻塞等待给mutex上锁
  • pthread_mutex_t *mutex:待上锁的锁
  • 返回值:0表示成功,失败返回错误号

pthread_mutex_trylock

  • 函数原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

  • 函数功能:非阻塞等待给mutex上锁
  • pthread_mutex_t *mutex:待上锁的锁
  • 返回值:0表示成功,失败返回错误号,如果是原来已上锁使用该函数会返回EBUSY。

pthread_mutex_unlock

  • 函数原型:

int pthread_mutex_unlock(pthread_mutex_t *mutex);

  • 函数功能:给mutex解锁
  • pthread_mutex_t *mutex:待解锁的锁
  • 返回值:0表示成功,失败返回错误号

状态对象

  • 如果要将其定义为进程之间可以持有的互斥锁,则需要传入属性对象地址。

lock_attr变量

  • pthread_mutexattr_t lock_attr;

初始化锁状态,设置状态状态为——进程共享

pthread_mutexattr_init(&lock_attr);
pthread_mutexattr_setpshared(&lock_attr, PTHREAD_PROCESS_SHARED);

销毁锁状态

  • pthread_mutexattr_destroy(&lock_attr);

条件锁(条件变量)

cond变量

  • pthread_cond_t mutex = PTHREAD_COND_INIALIZER

  • 如果cond是静态分配的,可用上述宏定义PTHREAD_COND_INITIALIZER来初始化,相当于用pthread_cond_init初始化并且attr参数为NULL。


pthread_cond_init

  • 函数原型:

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);

  • 函数功能:初始化锁且设置属性

  • pthread_cond_t *cond:待初始化的锁

  • pthread_condattr_t *cond_attr:锁的属性

  • 返回值:成功返回0,失败返回错误号


pthread_cond_destroy

  • 函数原型:

int pthread_cond_destroy(pthread_cond_t *cond);

  • 函数功能:销毁锁
  • pthread_cond_t *cond:销毁锁
  • 返回值:成功返回0,失败返回错误号

pthread_cond_wait

  • 函数原型:

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

  • 函数功能:归还当前得到的互斥锁,并阻塞等待条件的发生
  • pthread_cond_t *cond:条件变量
  • pthread_mutex_t *mutex:锁
  • 返回值:成功返回0,失败返回错误号

pthread_cond_timedwait

  • 函数原型:

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

  • 函数功能:和pthread_cond_wait类似,可以设定等待超时时间。如果超时仍未有线程幻想当前线程,就返回ETIMEDOUT
  • pthread_cond_t *cond:条件变量
  • pthread_mutex_t *mutex:锁
  • const struct timespec *abstime:超时时间
  • 返回值:成功返回0,失败返回错误号

pthread_cond_broadcast

  • 函数原型:

int pthread_cond_broadcast(pthread_cond_t *cond);

  • 函数功能:唤醒在这个条件上等待的所有线程
  • pthread_cond_t *cond:条件变量
  • 返回值:成功返回0,失败返回错误号

pthread_cond_signal

  • 函数原型:

int pthread_cond_signal(pthread_cond_t *cond);

  • 函数功能:唤醒在这个条件上等待的另一个线程
  • pthread_cond_t *cond:条件变量
  • 返回值:成功返回0,失败返回错误号

信号量

sem变量

sem_t sem


sem_init

  • 函数原型:

int sem_init(sem_t *sem, int pshared, unsigned int value);

  • 函数功能:初始化一个semaphore变量,value参数表示可用的资源数量
  • sem_t *sem:待初始化的信号量
  • int pshared:0表示信号量用于同一进程中的线程间同步,非0表示信号量用于进程间同步(需要挂载到共享内存中)
  • unsigned int value:可用的资源数量
  • 返回值:成功返回0,失败返回错误号

sem_wait

  • 函数原型:

int sem_wait(sem_t *sem);

  • 函数功能:尝试获得信号量资源,如果sem值已经为0,则挂起等待。
  • sem_t *sem:待操作的信号量
  • 返回值:成功返回0,失败返回错误号

sem_trywait

  • 函数原型:

int sem_trywait(sem_t *sem);

  • 函数功能:尝试获得信号量资源,如果sem值已经为0,则返回EAGAIN
  • sem_t *sem:待操作的信号量
  • 返回值:成功返回0,失败返回错误号

sem_timedwait

  • 函数原型:

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

  • 函数功能:尝试获得信号量资源,如果sem值已经为0,则挂起等待指定时间,若在指定时间内扔未获得信号量,则返回ETIMEDOUT
  • sem_t *sem:待操作的信号量
  • const struct timespec *abs_timeout:超时时间
  • 返回值:成功返回0,失败返回错误号

sem_post

  • 函数原型:

int sem_post(sem_t *sem);

  • 函数功能:释放资源,使信号量值加一,同时唤起挂起等待的线程
  • sem_t *sem:待操作的信号量
  • 返回值:成功返回0,失败返回错误号

sem_destroy

  • 函数原型:

int sem_destroy(sem_t *sem);

  • 函数功能:销毁信号量
  • sem_t *sem:待销毁的信号量
  • 返回值:成功返回0,失败返回错误号

标签:线程,函数,笔记,mutex,pthread,cond,sem
来源: https://blog.csdn.net/Left_Zzzz/article/details/121147255

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有