Linux多线程编程是系统编程的核心内容之一,涉及以下关键知识点:
#include <pthread.h>
gcc -pthread
或 gcc -lpthread
。c
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
终止线程:
pthread_exit(void *retval)
。pthread_cancel
)。等待线程结束:
int pthread_join(pthread_t thread, void **retval);
c
pthread_detach(pthread_t thread);
c
pthread_mutex_init(&mutex, NULL);
pthread_mutex_destroy(&mutex);
c
pthread_mutex_lock(&mutex); // 阻塞
pthread_mutex_trylock(&mutex); // 非阻塞
pthread_mutex_unlock(&mutex);
c
pthread_cond_wait(&cond, &mutex); // 等待条件(自动释放锁)
pthread_cond_signal(&cond); // 唤醒一个等待线程
pthread_cond_broadcast(&cond); // 唤醒所有等待线程
c
pthread_rwlock_rdlock(&rwlock); // 读锁
pthread_rwlock_wrlock(&rwlock); // 写锁
c
pthread_spin_lock(&spinlock);
c
pthread_barrier_wait(&barrier);
strtok_r
是 strtok
的可重入版本)。c
__thread int tls_var; // GCC扩展
或
pthread_key_create(&key, destructor);
pthread_setspecific(key, value);
sleep
)、手动设置 pthread_testcancel()
。c
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 1024*1024); // 1MB栈
pthread_create(&thread, &attr, func, NULL);
pthread_sigmask
屏蔽其他线程)。sigwait
同步处理信号。valgrind --tool=helgrind
检测数据竞争。gdb
调试多线程(info threads
、thread <id>
)。std::thread
、std::mutex
(需C++11及以上)。pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
Queue queue;
void* producer(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
queue.push(item);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
}
void* consumer(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (queue.empty()) {
pthread_cond_wait(&cond, &mutex);
}
Item item = queue.pop();
pthread_mutex_unlock(&mutex);
process(item);
}
}
掌握这些知识点后,可以进一步学习线程池设计、无锁编程(如原子操作)、多核并行优化(OpenMP)等高级主题。