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

线程

线程的概念

由于同一进程的多个线程共享同一地址空间,因此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,失败返回错误号
上一篇:【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )


下一篇:20191325学习笔记7