C和C++多线程
多线程
C多线程
1 线程
1.1 创建线程
int pthread_create(pthread_t * tid, const pthread_attr_t * attr, void * ( * func) (void * ), void * arg);
- 创建进程成功返回1, 否则返回错误码
pthread_t * tid
: 带回线程id,pthread_t
是一个无符号整数类型pthread_attr_t * attr
: 指定线程属性, 如线程优先级/初始栈大小void * ( * func) (void * )
: 多线程执行函数void * arg
: 多线程函数的若干参数, 多个参数需要封装为结构体
1.2 结束线程
void pthread_exit (void *status);
- 结束线程,
status
指针存储结束后返回状态
1.3 等待线程
int pthread_join (pthread_t tid, void ** status);
pthread_t tid
: 等待线程的idvoid ** status
: 等待线程的返回状态, 二重指针
1.4 其他相关函数
pthread_t pthread_self (void);
: 返回当前进程IDint pthread_detach (pthread_t tid);
: 将指定线程转为分离状态. 若指定线程是分离状态,则如果线程退出,那么它所有的资源都将释放, 即回收资源; 如果线程不是分离状态,线程必须保留它的线程ID,退出状态, 直到其他线程对他调用的pthread_join()
函数.
2 同步互斥
2.1 互斥锁
pthread_mutex_t mutex
: 互斥锁pthread_mutex_init(&mutex,NULL)
: 动态初始化互斥锁为解锁状态pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
: 静态初始化为解锁状态pthread_mutex_lock(&mutex)
: 访问临界区加锁操作pthread_mutex_unlock(&mutex)
: 访问临界区解锁操作pthread_mutex_destroy(&mutex)
: 销毁互斥锁
1 |
|
2.2 信号量
- 适用于支持有限个线程的共享资源,
1 |
|
2.3 条件变量
pthread_cond_wait()
的工作原理如下- 阻塞等待条件变量cond满足
- 解除已绑定的互斥锁(类似pthread_mutex_unlock)
- 当线程被唤醒, pthread_cond_wait()返回时, 解除阻塞并重新绑定互斥锁(类似pthread_mutex_lock)
- 重新绑定的原因是第三点不是原子操作, 防止其他运行态线程修改条件变量, 使得本线程拿到互斥锁后条件变量改变任然阻塞
1 |
|
C++ 多线程
头文件
<thread>
std::mutex
: 互斥量, lock()成员函数加锁, unlock()成员函数解锁std::lock_guard
: 作用域锁std::unique_lock
: 独占锁, 手动加锁和解锁std::condition_variable
: 条件变量1
2
3
4
5
6
7std::condition_variable cv;
std::mutex mtx;
bool ready = false;
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; }); // 等待条件满足
// 条件满足后执行std::atomi<>
: 原子操作thread_local [type] [var]
: 线程局部存储TLS
C和C++多线程
https://yee686.github.io/2024/03/26/C++多线程/