环境
- 操作系统: Linux
线程
创建线程
- 创建函数
#include <pthread.h>
/*
* @description 线程创建函数
* @param tidp 线程标识符
* @param attr 线程属性指针
* @param start_rtn 线程执行函数(void *fun(void *))
* @param arg 线程执行函数的参数
* @return 0,创建成功;其他,错误码
*/
int pthread_create(pthread_t *tidp,
const pthread_attr_t *attr,
(void*)(*start_rtn)(void*),
void *arg);
- 等待线程结束
#include <pthread.h>
/*
* @description 等待线程结束函数
* @param thread 线程标识符
* @param retval 获取线程结束返回值
* @return 0,创建成功;其他,错误码
*/
int pthread_join(pthread_t thread,
void **retval);
- 示例
#include <pthread.h>
//线程执行函数
void *threadHandler(void *param) {
while (1) {
...
}
}
int main(void) {
pthread_t threadID;
//创建线程
int code = pthread_create(&threadID, NULL, threadHandler, NULL);
...
//等待线程结束
code = pthread_join(threadID, NULL);
...
}
线程锁
- 初始化和销毁
#include <pthread.h>
/*
* @description 初始化锁
* @param mutex 线程互斥锁指针
* @param attr 互斥锁属性,可以传NULL使用默认值
* @return 0,成功;其他,错误码
*/
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
/*
* @description 销毁互斥锁
* @param mutex 线程互斥锁指针
* @return 0,成功;其他,错误码
*/
int pthread_mutex_destroy(pthread_mutex_t *mutex);
- 上锁函数,被占用将阻塞线程
#include <pthread.h>
/*
* @description 申请锁
* @param mutex 线程互斥锁
* @return 0,创建成功;其他,错误码
*/
int pthread_mutex_lock(pthread_mutex_t *mutex);
- 解锁函数
#include <pthread.h>
/*
* @description 解锁
* @param mutex 线程互斥锁
* @return 0,创建成功;其他,错误码
*/
int pthread_mutex_unlock(pthread_mutex_t *mutex);
- 示例
#include <pthread.h>
pthread_mutex_t mutex;
//线程执行函数
void *threadHandler(void *param) {
while (1) {
...
//申请锁
pthread_mutex_lock(&mutex);
...
//释放锁
pthread_mutex_unlock(&mutex);
...
}
}
原子操作(GCC)
同一个进程中,原子操作是不可被线程间抢占的。一个线程中的原子操作可以实现同步,加快线程间的协调作用,进行无锁化编程。
type __sync_fetch_and_add (type *ptr, type value); //获取值后加上value
type __sync_fetch_and_sub (type *ptr, type value);
type __sync_fetch_and_or (type *ptr, type value);
type __sync_fetch_and_and (type *ptr, type value);
type __sync_fetch_and_xor (type *ptr, type value);
type __sync_fetch_and_nand (type *ptr, type value);
type __sync_add_and_fetch (type *ptr, type value);
type __sync_sub_and_fetch (type *ptr, type value);
type __sync_or_and_fetch (type *ptr, type value);
type __sync_and_and_fetch (type *ptr, type value);
type __sync_xor_and_fetch (type *ptr, type value);
type __sync_nand_and_fetch (type *ptr, type value);
线程相关知识
- 线程内部创建变量是不共享的