前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程(2)

线程(2)

作者头像
franket
发布2021-09-15 20:07:55
3130
发布2021-09-15 20:07:55
举报
文章被收录于专栏:技术杂记技术杂记

sem_t

bits/semaphore.h 中有关于 sem_t 的定义

代码语言:javascript
复制
#include <bits/wordsize.h>

#if __WORDSIZE == 64
# define __SIZEOF_SEM_T 32
#else
# define __SIZEOF_SEM_T 16
#endif


/* Value returned if `sem_open' failed.  */
#define SEM_FAILED      ((sem_t *) 0)


typedef union
{
  char __size[__SIZEOF_SEM_T];
  long int __align;
} sem_t;

可知 sem_t 是一个联合体


sem_init

semaphore.h 中有关于 sem_init 的定义

代码语言:javascript
复制
/* Initialize semaphore object SEM to VALUE.  If PSHARED then share it
   with other processes.  */
extern int sem_init (sem_t *__sem, int __pshared, unsigned int __value)
     __THROW;

__sem 指向信号量结构的一个指针

__pshared 不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享

__value 信号量的初始值

sem_init() 成功时返回 0;错误时,返回 -1,并把 errno 设置为合适的值

可能错误:

代码语言:javascript
复制
EINVAL : value 超过 SEM_VALUE_MAX。
ENOSYS : pshared 非零,但系统还没有支持进程共享的信号量

pthread_create

pthread.h 中有关于 pthread_create 的定义

代码语言:javascript
复制
/* Create a new thread, starting with execution of START-ROUTINE
   getting passed ARG.  Creation attributed come from ATTR.  The new
   handle is stored in *NEWTHREAD.  */
extern int pthread_create (pthread_t *__restrict __newthread,
                           __const pthread_attr_t *__restrict __attr,
                           void *(*__start_routine) (void *),
                           void *__restrict __arg) __THROW __nonnull ((1, 3));

用来创建一个线程

__newthread 指向线程标识符的指针

__attr 设置线程属性,一般配置为NULL

(*__start_routine) (void *) 线程运行函数的起始地址

__arg 运行函数的参数,如果没有参数,一般配置为NULL

返回值:成功,返回0;出错,返回-1


pthread_join

pthread.h 中有关于 pthread_join 的定义

代码语言:javascript
复制
/* Make calling thread wait for termination of the thread TH.  The
   exit status of the thread is stored in *THREAD_RETURN, if THREAD_RETURN
   is not NULL.

   This function is a cancellation point and therefore not marked with
   __THROW.  */
extern int pthread_join (pthread_t __th, void **__thread_return);

调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回

__th 被等待的线程标识符

__thread_return 为一个用户定义的指针,它可以用来存储被等待线程的返回值


sem_wait

semaphore.h 中有关于 sem_wait 的声明

代码语言:javascript
复制
/* Wait for SEM being posted.

   This function is a cancellation point and therefore not marked with
   __THROW.  */
extern int sem_wait (sem_t *__sem);

被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少

__sem 信号量变量


sem_post

semaphore.h 中有关于 sem_post 的声明

代码语言:javascript
复制
/* Post SEM.  */
extern int sem_post (sem_t *__sem) __THROW;

用来增加信号量的值

__sem 信号量变量

成功时返回 0;错误时,信号量的值没有更改,-1 被返回,并设置errno 来指明错误

代码语言:javascript
复制
EINVAL  sem 不是一个有效的信号量 
EOVERFLOW 信号量允许的最大值将要被超过

总结

以下函数可以进行信号量和线程的创建与控制

  • sem_init
  • pthread_create
  • pthread_join
  • sem_wait
  • sem_post

通过各方面资料弄懂其参数的意义和返回值的类型,是熟练掌握的基础

原文地址

本文系转载,前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • sem_t
  • sem_init
  • pthread_create
  • pthread_join
  • sem_wait
  • sem_post
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com