Linux系统提供了强大的多线程编程支持,主要通过POSIX线程库(pthread)来实现。以下是Linux多线程编程的详细实现方法:
#include <pthread.h>
gcc program.c -o program -lpthread
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
示例:
void *thread_function(void *arg) {
printf("线程运行中\n");
return NULL;
}
int main() {
pthread_t thread_id;
pthread_create(&thread_id, NULL, thread_function, NULL);
pthread_join(thread_id, NULL); // 等待线程结束
return 0;
}
pthread_exit()
void pthread_exit(void *retval);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 加锁
pthread_mutex_lock(&mutex);
// 临界区代码
// 解锁
pthread_mutex_unlock(&mutex);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// 等待条件
pthread_cond_wait(&cond, &mutex);
// 发送信号
pthread_cond_signal(&cond); // 唤醒一个线程
pthread_cond_broadcast(&cond); // 唤醒所有线程
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
// 读锁
pthread_rwlock_rdlock(&rwlock);
// 写锁
pthread_rwlock_wrlock(&rwlock);
// 解锁
pthread_rwlock_unlock(&rwlock);
可以设置线程的栈大小、调度策略等属性:
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
// 更多属性设置...
pthread_create(&thread_id, &attr, thread_function, NULL);
pthread_attr_destroy(&attr);
每个线程可以有自己的变量副本:
__thread int thread_local_var = 0;
或使用POSIX接口:
pthread_key_t key;
void destructor(void *value) {
free(value);
}
pthread_key_create(&key, destructor);
// 设置线程特定数据
pthread_setspecific(key, some_value);
// 获取线程特定数据
void *value = pthread_getspecific(key);
// 设置取消状态
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
// 设置取消类型
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
// 取消线程
pthread_cancel(thread_id);
// 设置取消点
pthread_testcancel();
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#define THREAD_NUM 5
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *worker(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
printf("Thread %ld: 工作完成\n", (long)arg);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t threads[THREAD_NUM];
// 创建线程池
for (long i = 0; i < THREAD_NUM; i++) {
pthread_create(&threads[i], NULL, worker, (void *)i);
}
// 分配任务
for (int i = 0; i < 10; i++) {
pthread_cond_broadcast(&cond);
sleep(1);
}
// 清理
for (int i = 0; i < THREAD_NUM; i++) {
pthread_cancel(threads[i]);
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
gdb
:支持多线程调试valgrind
:检测内存泄漏和线程错误strace
/ltrace
:跟踪系统调用和库调用top -H
:查看线程资源使用情况通过合理使用这些多线程编程技术,可以在Linux系统上开发出高效、可靠的并发应用程序。