`头文件)进行多线程编程,重点讲解线程栈、TLS(线程局部存储)、互斥锁和条件变量。
1. 线程栈(Thread Stack)
每个线程拥有独立的栈空间,用于存放局部变量和函数调用帧等信息。默认情况下,子线程的栈大小为2MB,可以通过系统命令`ulimit -s`查看。
#include
#include
void* thread_routine(void* arg) {
int local_data = 50; // 存储在栈上的局部变量
printf("Thread ID: %lu, Local Data: %d\n", pthread_self(), local_data);
return NULL;
}
int main() {
pthread_t thread_id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 2 * 1024 * 1024); // 设置2MB栈大小
pthread_create(&thread_id, &attr, thread_routine, NULL);
pthread_join(thread_id, NULL);
pthread_attr_destroy(&attr);
return 0;
}
2. TLS(Thread Local Storage)
TLS允许每个线程拥有自己的"全局"变量副本,避免了共享变量带来的竞争问题。可以使用`__thread`关键字或者`pthread_key_t`来实现。
#include
#include
#include
pthread_key_t tls_key;
void cleanup(void* ptr) {
printf("Thread %lu: Releasing resource at %p\n", pthread_self(), ptr);
free(ptr);
}
void* thread_function(void* arg) {
int* private_data = malloc(sizeof(int));
*private_data = (int)(long)arg;
pthread_setspecific(tls_key, private_data);
printf("Thread %lu: Private Data: %d\n", pthread_self(), *(int*)pthread_getspecific(tls_key));
return NULL;
}
int main() {
pthread_key_create(&tls_key, cleanup);
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, thread_function, (void*)1);
pthread_create(&thread2, NULL, thread_function, (void*)2);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_key_delete(tls_key);
return 0;
}
3. 互斥锁(Mutex)
互斥锁确保同一时刻只有一个线程能够访问共享资源,防止数据竞争。
#include
#include
pthread_mutex_t lock;
int shared_counter = 0;
void* increment_counter(void* arg) {
for (int i = 0; i < 100000; ++i) {
pthread_mutex_lock(&lock);
++shared_counter;
pthread_mutex_unlock(&lock);
}
return NULL;
}
int main() {
pthread_mutex_init(&lock, NULL);
pthread_t t1, t2;
pthread_create(&t1, NULL, increment_counter, NULL);
pthread_create(&t2, NULL, increment_counter, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
printf("Final Counter Value: %d\n", shared_counter);
pthread_mutex_destroy(&lock);
return 0;
}
4. 条件变量(Condition Variable)
条件变量用于线程间的同步,通常与互斥锁配合使用。
#include
#include
#include
pthread_mutex_t mtx;
pthread_cond_t cv;
int ready_flag = 0;
void* producer(void* arg) {
pthread_mutex_lock(&mtx);
ready_flag = 1;
printf("Producer: Resource is ready.\n");
pthread_cond_signal(&cv);
pthread_mutex_unlock(&mtx);
return NULL;
}
void* consumer(void* arg) {
pthread_mutex_lock(&mtx);
while (!ready_flag) {
pthread_cond_wait(&cv, &mtx);
}
printf("Consumer: Resource acquired.\n");
pthread_mutex_unlock(&mtx);
return NULL;
}
int main() {
pthread_mutex_init(&mtx, NULL);
pthread_cond_init(&cv, NULL);
pthread_t prod, cons;
pthread_create(&cons, NULL, consumer, NULL);
sleep(1);
pthread_create(&prod, NULL, producer, NULL);
pthread_join(prod, NULL);
pthread_join(cons, NULL);
pthread_mutex_destroy(&mtx);
pthread_cond_destroy(&cv);
return 0;
}