C语言最常用的并发编程方式是使用线程。线程是程序执行流的最小单元,多个线程可以同时并发执行不同的任务,从而提高程序的性能和响应速度。
线程的使用需要引入pthread库,包含头文件<pthread.h>
。下面是实现线程的基本步骤:
-
创建线程:使用函数
pthread_create
创建子线程。该函数有四个参数,分别为线程对应的指针、线程属性、线程运行的函数和函数参数。通常只需要设置线程函数和函数参数即可,线程属性可以设置为NULL。 -
线程函数:线程函数是线程实际执行任务的函数,可以传递参数和返回值。线程函数的定义格式为:
void *thread_function(void *arg)
{
// thread code
return NULL;
}
其中,arg
是线程函数的参数,可以为任何数据类型,但是必须使用指针传递,函数返回值为void*
类型。
- 启动线程:线程创建后默认处于阻塞状态,需要使用函数
pthread_join
启动线程。该函数会阻塞主线程直到子线程执行完毕。函数定义如下:
int pthread_join(pthread_t thread, void **retval);
其中,thread
参数为线程的指针,retval
用于存储线程的返回值,如果线程没有返回值可以设置为NULL。
下面是一个简单的示例,在主线程中创建一个子线程,子线程执行简单计算任务:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 子线程任务函数
void *calc(void *arg)
{
int num = *(int*)arg; // 获取参数
int result = 0;
for (int i = 1; i <= num; i++) {
result += i;
}
return (void*)result;
}
int main()
{
pthread_t tid;
int n = 1000000;
int *p;
// 创建子线程
if (pthread_create(&tid, NULL, calc, &n) != 0) {
perror("create thread failed");
exit(EXIT_FAILURE);
}
// 启动子线程并获取计算结果
if (pthread_join(tid, (void**)&p) != 0) {
perror("join thread failed");
exit(EXIT_FAILURE);
}
printf("1 + 2 + ... + %d = %d\n", n, *p);
free(p);
return 0;
}
另一个常见的并发编程方式是使用信号量和互斥锁来同步和控制线程的执行。下面是一个简单的示例,演示如何使用互斥锁保护多个线程同时访问共享资源:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_NUM 5
#define COUNT_NUM 1000000
int global_count = 0; // 共享资源
pthread_mutex_t mutex; // 互斥锁
// 线程任务函数
void *thread_function(void *arg)
{
for (int i = 0; i < COUNT_NUM; i++) {
pthread_mutex_lock(&mutex); // 加锁
global_count++;
pthread_mutex_unlock(&mutex); // 解锁
}
return NULL;
}
int main()
{
pthread_t tid[THREAD_NUM];
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
// 创建多个线程
for (int i = 0; i < THREAD_NUM; i++) {
if (pthread_create(&tid[i], NULL, thread_function, NULL) != 0) {
perror("create thread failed");
exit(EXIT_FAILURE);
}
}
// 启动多个线程并等待执行完毕
for (int i = 0; i < THREAD_NUM; i++) {
if (pthread_join(tid[i], NULL) != 0) {
perror("join thread failed");
exit(EXIT_FAILURE);
}
}
printf("global_count = %d\n", global_count);
pthread_mutex_destroy(&mutex); // 销毁互斥锁
return 0;
}
在上述示例中,使用互斥锁保护对共享资源global_count
的访问,多个线程同时访问时会出现竞争,加锁操作可以保证同时只有一个线程可以对资源进行操作,解锁操作可以释放锁,让其他线程可以访问资源。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中如何进行并发编程? - Python技术站