C语言编程(多线程)

多线程是指在同一时间内,CPU可以运行多个线程同时执行不同任务的一种技术。在C语言中,多线程编程是通过使用线程库来实现的。

C语言中常用的线程库有pthread和WinAPI。这里我们主要讲解pthread库的使用方法和相关案例示例。

## 1. pthread库

pthread库是POSIX线程标准的实现,支持跨平台。在Linux系统中,几乎所有的C编译器都包含了pthread库,不需要额外安装。

pthread库中包含了一组操作线程的函数,如创建线程、关闭线程、等待线程结束等。下面介绍几个常用的函数:

- `pthread_create()`:创建一个线程并运行线程函数;

- `pthread_join()`:等待线程结束,并且获取线程返回值;

- `pthread_exit()`:退出线程;

- `pthread_mutex_lock()`和`pthread_mutex_unlock()`:互斥锁相关函数,用于保证多线程访问共享资源的安全性;

- `pthread_cond_wait()`和`pthread_cond_signal()`:条件变量相关函数,用于线程之间的同步和通信。

## 2. pthread库的使用方法

### 2.1 创建线程

创建一个线程需要调用`pthread_create()`函数,这个函数的第一个参数是指向线程的标识符的指针,第二个参数是线程属性,第三个参数是线程运行的函数,第四个参数是线程运行函数的参数。

```c

pthread_t thread_id;

pthread_create(&thread_id, NULL, my_thread_func, (void*)arg);

```

### 2.2 关闭线程

关闭一个线程需要调用`pthread_exit()`函数。

```c

pthread_exit(NULL);

```

### 2.3 等待线程结束

等待一个线程结束需要调用`pthread_join()`函数,并且获取线程返回值。

```c

void *result;

pthread_join(thread_id, &result);

```

### 2.4 互斥锁

互斥锁一般在多线程对共享资源进行访问的时候使用,以保证线程运行的安全性。而互斥锁的创建、销毁、使用等流程则是经典的生产者和消费者模型。

创建互斥锁需要调用`pthread_mutex_init()`函数,销毁互斥锁需要调用`pthread_mutex_destroy()`函数。使用互斥锁需要加锁和解锁。

```c

pthread_mutex_t mutex;

// 创建互斥锁

pthread_mutex_init(&mutex, NULL);

// 使用互斥锁加锁

pthread_mutex_lock(&mutex);

// 使用互斥锁解锁

pthread_mutex_unlock(&mutex);

// 销毁互斥锁

pthread_mutex_destroy(&mutex);

```

### 2.5 条件变量

条件变量则是用于线程之间同步和通信的技术。当一个线程在等待某个条件时,可以通过条件变量阻塞等待,直到另一个线程改变了条件并通知它。条件变量是与互斥锁配合使用的,互斥锁的主要作用是保护条件变量。

创建条件变量需要调用`pthread_cond_init()`函数,销毁条件变量需要调用`pthread_cond_destroy()`函数。使用条件变量需要等待和发送。

```c

pthread_cond_t condition_var;

// 创建条件变量

pthread_cond_init(&condition_var, NULL);

// 等待条件变量

pthread_cond_wait(&condition_var, &mutex);

// 发送条件变量通知

pthread_cond_signal(&condition_var);

// 销毁条件变量

pthread_cond_destroy(&condition_var);

```

## 3. 多线程编程案例

下面给出一个简单的多线程编程案例,通过多线程并行计算数组中所有元素的和。这个例子主要展示了如何使用pthread库创建、开启、等待和关闭线程以及如何使用互斥锁确保多线程并行访问数据的安全性。

```c

#include

#include

#include

#define ARRAY_SIZE 10000000

#define THREAD_COUNT 2

// 共享资源

int my_array[ARRAY_SIZE];

long my_sum = 0;

pthread_mutex_t my_mutex;

// 子线程计算子区间的和

void *my_thread_func(void *param) {

int start = (int)param;

int end = start + ARRAY_SIZE / THREAD_COUNT;

long sum = 0;

for (int i = start; i < end; ++i) {

sum += my_array[i];

}

pthread_mutex_lock(&my_mutex);

my_sum += sum;

pthread_mutex_unlock(&my_mutex);

return NULL;

}

int main() {

pthread_t threads[THREAD_COUNT];

pthread_mutex_init(&my_mutex, NULL);

// 初始化共享资源

for (int i = 0; i < ARRAY_SIZE; ++i) {

my_array[i] = i;

}

// 创建子线程,开始并行计算数组元素的和

for (int i = 0; i < THREAD_COUNT; ++i) {

int start = i * (ARRAY_SIZE / THREAD_COUNT);

pthread_create(&threads[i], NULL, my_thread_func, (void*)start);

}

// 等待所有子线程计算完毕

for (int i = 0; i < THREAD_COUNT; ++i) {

pthread_join(threads[i], NULL);

}

pthread_mutex_destroy(&my_mutex);

printf("The sum of array is %ld.\n", my_sum);

return 0;

}

```

以上就是使用pthread库实现多线程编程的详细介绍和简单案例分享。通过多线程编程,可以充分利用计算机系统中的多核CPU资源,提高程序的执行效率和性能,同时也可以解决一些需要异步处理的问题。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(73) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部