线程(Thread)是现代操作系统中用于并发执行代码块的基本单位,它可以让程序在多核处理器上更有效地运行。在C语言中,POSIX线程(pthreads)库是一个常见的线程实现方法。本文将详细介绍如何在C语言中使用线程,包括创建、管理和同步线程。
创建线程
在C语言中,我们使用pthread_create函数来创建线程。它具有以下原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
其中:
thread
:线程ID的指针。
attr
:线程属性,通常设置为NULL使用默认属性。
start_routine
:线程执行函数的指针。
arg
:传递给线程执行函数的参数。
下面是一个简单的例子,演示如何创建一个线程并在其内执行一个函数:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void* myThreadFunction(void* arg) {
printf("Hello from the new thread!\n");
return NULL;
}
int main() {
pthread_t myThread;
if(pthread_create(&myThread, NULL, myThreadFunction, NULL)) {
fprintf(stderr, "Error creating thread\n");
return 1;
}
if(pthread_join(myThread, NULL)) {
fprintf(stderr, "Error joining thread\n");
return 2;
}
printf("Thread has finished execution.\n");
return 0;
}
管理线程
线程连接(Join)
为了确保主线程等待子线程完成执行,可以使用pthread_join函数。它的原型如下:
int pthread_join(pthread_t thread, void **retval);
其中:
thread
:需要等待的线程ID。
retval
:存储线程返回值的指针。
线程分离(Detach)
如果想让线程在完成后自动释放其资源,可以使用pthread_detach函数。它的原型如下:
int pthread_detach(pthread_t thread);
例子如下:
#include <pthread.h>
#include <stdio.h>
void* myThreadFunction(void* arg) {
printf("Detached thread is running!\n");
return NULL;
}
int main() {
pthread_t myThread;
if(pthread_create(&myThread, NULL, myThreadFunction, NULL)) {
fprintf(stderr, "Error creating thread\n");
return 1;
}
pthread_detach(myThread);
printf("Main thread is continuing...\n");
sleep(1); // Sleep to give detached thread time to execute
return 0;
}
线程同步
互斥锁(Mutex)
在多线程编程中,多个线程同时访问共享数据会导致竞态条件(race condition)。互斥锁提供了一种机制来保证某一时刻只有一个线程能够访问共享资源。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int counter = 0;
pthread_mutex_t mutex;
void* incrementCounter(void* arg) {
for(int i = 0; i < 100000; ++i) {
pthread_mutex_lock(&mutex);
++counter;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t threads[2];
pthread_mutex_init(&mutex, NULL);
for(int i = 0; i < 2; ++i) {
if(pthread_create(&threads[i], NULL, incrementCounter, NULL)) {
fprintf(stderr, "Error creating thread\n");
return 1;
}
}
for(int i = 0; i < 2; ++i) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
printf("Final counter value: %d\n", counter);
return 0;
}
条件变量(Condition Variable)
条件变量用于线程间的通信,它允许线程等待某个特定条件发生后再继续执行。我们使用pthread_cond_t来定义条件变量,并用pthread_cond_wait和pthread_cond_signal函数来控制其行为。
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int ready = 0;
void* waitThread(void* arg) {
pthread_mutex_lock(&mutex);
while(!ready) {
pthread_cond_wait(&cond, &mutex);
}
printf("Thread received signal and is now running!\n");
pthread_mutex_unlock(&mutex);
return NULL;
}
void* signalThread(void* arg) {
pthread_mutex_lock(&mutex);
ready = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t wait, signal;
pthread_create(&wait, NULL, waitThread, NULL);
sleep(1); // Sleep to ensure waitThread is waiting on condition variable
pthread_create(&signal, NULL, signalThread, NULL);
pthread_join(wait, NULL);
pthread_join(signal, NULL);
return 0;
}
总之,线程在C语言中提供了一种强大的并发处理技术,能够极大地提高程序的执行效率。通过学习线程的创建、管理与同步,我们可以编写更加高效和健壮的多线程程序。