线程(2)

2021-09-15 20:07:55 浏览数 (3)

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

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

原文地址

0 人点赞