sem_t
bits/semaphore.h
中有关于 sem_t 的定义
#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 的定义
/* 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 的定义
/* 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 的定义
/* 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 的声明
/* 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 的声明
/* 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
通过各方面资料弄懂其参数的意义和返回值的类型,是熟练掌握的基础
原文地址