在 C 语言的多线程编程中,POSIX 线程库(pthread
)提供了一系列函数,用于创建、管理和同步线程。下面详细讲解多线程编程中常用的基础函数及其作用。
1. pthread_create
- 功能:用于创建新线程。
- 原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
- 参数:
pthread_t *thread
:线程ID,用于标识线程。pthread_attr_t *attr
:线程属性,NULL
表示使用默认属性。void *(*start_routine)(void *)
:线程入口函数,线程从这里开始执行。void *arg
:传递给线程函数的参数。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_t thread;
pthread_create(&thread, NULL, myThreadFunc, arg);
2. pthread_exit
- 功能:终止当前线程。
- 原型:
void pthread_exit(void *retval);
- 参数:
retval
:线程的返回值,可供其他线程通过pthread_join()
获取。
- 该函数不会返回,一旦调用后线程立刻退出。
示例:
pthread_exit(NULL); // 线程退出
3. pthread_join
- 功能:阻塞主线程,等待指定线程结束,并获取该线程的返回值。
- 原型:
int pthread_join(pthread_t thread, void **retval);
- 参数:
pthread_t thread
:要等待的线程的ID。void **retval
:用于存储线程的返回值,若不需要可以传NULL
。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_join(thread, NULL); // 等待线程结束
4. pthread_mutex_init
- 功能:初始化互斥锁(mutex),互斥锁用于保护共享资源,确保同一时间只有一个线程访问资源。
- 原型:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
- 参数:
pthread_mutex_t *mutex
:指向互斥锁的指针。pthread_mutexattr_t *attr
:互斥锁的属性,传NULL
表示使用默认属性。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_mutex_t lock;
pthread_mutex_init(&lock, NULL); // 初始化互斥锁
5. pthread_mutex_lock
- 功能:加锁。线程调用该函数时,如果该互斥锁已经被其他线程加锁,则调用线程会阻塞,直到锁可用。
- 原型:
int pthread_mutex_lock(pthread_mutex_t *mutex);
- 参数:
pthread_mutex_t *mutex
:指向互斥锁的指针。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_mutex_lock(&lock); // 加锁
6. pthread_mutex_unlock
- 功能:解锁。调用该函数后,锁被释放,其他等待的线程可以继续执行。
- 原型:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
- 参数:
pthread_mutex_t *mutex
:指向互斥锁的指针。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_mutex_unlock(&lock); // 解锁
7. pthread_mutex_destroy
- 功能:销毁互斥锁,释放相关资源。互斥锁在不再使用时需要销毁。
- 原型:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
- 参数:
pthread_mutex_t *mutex
:指向互斥锁的指针。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_mutex_destroy(&lock); // 销毁互斥锁
8. pthread_cond_init
- 功能:初始化条件变量。条件变量用于线程之间的同步机制,一个线程可以等待条件变量,另一个线程可以发信号满足条件。
- 原型:
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
- 参数:
pthread_cond_t *cond
:指向条件变量的指针。pthread_condattr_t *attr
:条件变量的属性,NULL
表示使用默认属性。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_cond_t cond;
pthread_cond_init(&cond, NULL); // 初始化条件变量
9. 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_mutex_lock(&lock);
pthread_cond_wait(&cond, &lock); // 等待条件变量
pthread_mutex_unlock(&lock);
10. pthread_cond_signal
- 功能:发送信号,唤醒一个等待在条件变量上的线程。
- 原型:
int pthread_cond_signal(pthread_cond_t *cond);
- 参数:
pthread_cond_t *cond
:指向条件变量的指针。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_cond_signal(&cond); // 发出信号
11. pthread_cond_broadcast
- 功能:发送广播信号,唤醒所有等待在条件变量上的线程。
- 原型:
int pthread_cond_broadcast(pthread_cond_t *cond);
- 参数:
pthread_cond_t *cond
:指向条件变量的指针。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_cond_broadcast(&cond); // 唤醒所有等待的线程
12. pthread_cond_destroy
- 功能:销毁条件变量,释放相关资源。
- 原型:
int pthread_cond_destroy(pthread_cond_t *cond);
- 参数:
pthread_cond_t *cond
:指向条件变量的指针。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_cond_destroy(&cond); // 销毁条件变量
13. pthread_cancel
- 功能:用于请求取消某个线程的执行。线程可以通过设置取消状态来响应取消请求。
- 原型:
int pthread_cancel(pthread_t thread);
- 参数:
pthread_t thread
:要取消的线程的ID。
- 返回值:成功返回 0,失败返回错误码。
示例:
pthread_cancel(thread); // 请求取消线程
总结:
线程创建和管理:
pthread_create
:创建线程。pthread_join
:等待线程完成。pthread_exit
:终止线程。pthread_cancel
:取消线程。
互斥锁:
pthread_mutex_init
:初始化互
斥锁。
pthread_mutex_lock
:加锁。pthread_mutex_unlock
:解锁。pthread_mutex_destroy
:销毁互斥锁。条件变量:
pthread_cond_init
:初始化条件变量。pthread_cond_wait
:等待条件满足。pthread_cond_signal
:发出信号,唤醒一个线程。pthread_cond_broadcast
:广播信号,唤醒所有线程。pthread_cond_destroy
:销毁条件变量。
这些基础函数提供了多线程编程中的线程创建、同步和管理的基本工具。在多线程编程中,正确使用这些函数确保线程之间的协作和共享资源的安全性。