使用pthread_create创建线程
在C语言中,线程是一种轻量级的执行单元,可以与同一进程中的其他线程共享进程的数据空间。线程可以并行执行,提高程序的运行效率。C语言提供了一个名为pthread的库,用于创建和操作线程。通过使用pthread库的pthread_create函数,可以创建多个线程来执行不同的任务。
1. pthread_create函数参数
pthread_create函数的原型如下:
#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
pthread_create函数共有四个参数:
- thread:指向pthread_t类型的指针,用于存储新创建的线程ID。
- attr:指向pthread_attr_t类型的指针,用于指定新线程的属性。一般可以将该参数置为NULL,使用默认属性。
- start_routine:指向函数的指针,新线程将从该函数开始执行。
- arg:传递给start_routine函数的参数,可以是任意类型的指针。
2. 创建线程的步骤
创建新线程的过程可以分为以下几个步骤:
- 引入pthread.h头文件:在使用pthread_create函数之前,需要在代码中引入pthread.h头文件。
- 定义线程函数:创建线程之前,需要定义一个线程函数,该函数的返回类型为void*,参数类型为void*。线程将从该函数开始执行。
- 声明线程ID变量:声明一个pthread_t类型的变量,用于存储新创建的线程ID。
- 调用pthread_create函数:使用pthread_create函数创建新线程,将线程ID存储在之前声明的变量中。
- 等待线程结束:使用pthread_join函数等待新线程执行结束。
3. 示例代码
下面是一个使用pthread_create函数创建线程的示例代码:
#include <stdio.h> #include <pthread.h> void *thread_function(void *arg) { int thread_id = *(int *)arg; printf(\"Thread ID: %d\ \", thread_id); // 线程执行的任务代码 pthread_exit(NULL); } int main() { pthread_t threads[5]; for (int i = 0; i < 5; i++) { int thread_id = i; pthread_create(&threads[i], NULL, thread_function, (void *)&thread_id); } for (int i = 0; i < 5; i++) { pthread_join(threads[i], NULL); } return 0; }
在上述示例代码中,首先定义了一个线程函数thread_function,用于执行新线程的任务。该函数接收一个参数arg,其中thread_id存储在arg中,表示线程的ID。在thread_function函数中,可以执行需要新线程处理的任务。
在main函数中,声明了一个pthread_t类型的数组threads,用于存储新创建的线程ID。
接下来,使用for循环创建5个线程,循环变量i表示线程的ID。通过pthread_create函数创建新线程时,将线程ID赋值给thread_id,并使用&threads[i]存储线程ID。
在创建完所有线程后,再次使用for循环调用pthread_join函数等待线程执行结束。
4. 线程同步与互斥
在多线程程序中,为了保证多个线程对共享资源的访问安全,需要使用同步和互斥机制。pthread库提供了多种同步和互斥的函数和机制。
常用的同步机制包括互斥锁(pthread_mutex_t)、条件变量(pthread_cond_t)、读写锁(pthread_rwlock_t)等。通过使用这些机制,可以实现线程间的同步与互斥。
下面是一个使用互斥锁实现线程同步的示例代码:
#include <stdio.h> #include <pthread.h> pthread_mutex_t mutex; int counter = 0; void *thread_function(void *arg) { pthread_mutex_lock(&mutex); // 访问共享资源的代码 counter++; pthread_mutex_unlock(&mutex); pthread_exit(NULL); } int main() { pthread_t threads[5]; pthread_mutex_init(&mutex, NULL); for (int i = 0; i < 5; i++) { pthread_create(&threads[i], NULL, thread_function, NULL); } for (int i = 0; i < 5; i++) { pthread_join(threads[i], NULL); } pthread_mutex_destroy(&mutex); printf(\"Counter value: %d\ \", counter); return 0; }
在上述示例代码中,首先使用pthread_mutex_init函数初始化互斥锁。
在thread_function函数中,通过调用pthread_mutex_lock函数可以实现对互斥锁的加锁操作,保证只有一个线程可以访问共享资源(counter)。在访问共享资源之后,通过调用pthread_mutex_unlock函数释放互斥锁。
在main函数中,依然使用一个数组来存储线程ID,并通过for循环创建5个线程。每个线程都调用thread_function函数。
在创建完所有线程后,再次使用for循环调用pthread_join函数等待线程执行结束。
最后,使用pthread_mutex_destroy函数销毁互斥锁,并打印counter的值。
总结
使用pthread_create函数可以在C语言中创建多个线程来执行不同的任务。通过合理地使用线程,可以提高程序的运行效率,实现任务的并行执行。同时,为了保证多个线程对共享资源的访问安全,可以使用pthread库提供的同步和互斥机制。