向你的C语言项目中加入多线程

C语言在标准库<pthread.h>中为程序员提供了多线程操作接口。

先从简单操作入手

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *arg), void *arg) 线程创建
int pthread_join( pthread_t thread, void * * value_ptr ) 线程等待
int pthread_detach(pthread_t thread) 线程分离
int pthread_exit(pthread_t th, void **thr_return) 线程结束

pthread_t

pthread_t是表示线程号的数据类型。它的出处是/usr/include/bits/pthreadtypes.h

typedef unsigned long int pthread_t

pthread_create

线程创建函数,为新线程分配资源并且创建成功后线程即开始运行,新线程的线程号即传参进去的线程号。

通过第二个参数指定新线程的属性为“joinable”或“detached”,默认为joinable。若线程属性为joinable,则需要由其他线程调用pthread_join阻塞等待其结束并为之回收资源,不然就成了"僵尸线程";若线程属性为detached,则线程结束后自动回收所有资源。

  • 参数说明
int pthread_create(pthread_t *thread,   目标线程的线程号
                    pthread_attr_t *attr,  设置线程的属性
                    void *(*start_routine) (void *arg), 目标函数的起始地址
                    void *arg) 目标函数的参数 
  • 返回值
    如果线程创建成功,返回0; 如果线程创建失败,返回错误编号。

pthread_join

当调用pthread_join时,当前线程进入阻塞状态,等待被连接的线程运行结束返回,当前线程再转回运行状态。被连接的线程必须是非分离的。一个线程不能被多个线程等待。

  • 参数说明
int pthread_join( pthread_t  thread,      目标线程的线程号 
                  void * * value_ptr )      目标线程的返回值
  • 返回值
    成功则返回0; 失败则返回错误编号。

pthread_detach

将joinable的线程设置为detached的线程。这样该线程在运行结束后会自动回收其所有资源。

pthread_exit

调用pthread_exit可以显式地结束当前线程,传入的唯一的参数是线程的返回值。

掌握基本操作后开始学习新技能

互斥锁

//两种方法对锁进行初始化
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
              const pthread_mutexattr_t *restrict attr);
//互斥锁的销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);

//获得锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);

//释放锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);

条件变量

// 初始化条件变量
int pthread_cond_init(pthread_cond_t *cond,
						pthread_condattr_t *cond_attr);

// 阻塞等待
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

// 超时等待
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,
						const timespec *abstime);

// 解除所有线程的阻塞
int pthread_cond_destroy(pthread_cond_t *cond);

// 至少唤醒一个等待该条件的线程
int pthread_cond_signal(pthread_cond_t *cond);

// 唤醒等待该条件的所有线程
int pthread_cond_broadcast(pthread_cond_t *cond); 



posted @ 2020-09-16 15:24  dynmi  阅读(20)  评论(0编辑  收藏