问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言如何创建多线程:使用pthread库、初始化线程属性、创建线程、同步线程

创作时间:
作者:
@小白创作中心

C语言如何创建多线程:使用pthread库、初始化线程属性、创建线程、同步线程

引用
1
来源
1.
https://docs.pingcode.com/baike/1253581


C语言如何创建多线程:使用pthread库、初始化线程属性、创建线程、同步线程。在C语言中,多线程编程主要依赖于POSIX线程库(pthread)。通过pthread库,程序员可以创建和管理多个线程,提升程序的并发性和性能。使用pthread库是创建多线程的基础,通过它我们可以轻松实现线程的创建和管理。下面将详细介绍如何使用pthread库进行多线程编程。

一、使用pthread库

在C语言中,使用POSIX线程库(pthread)是实现多线程编程的主要方法。该库提供了一组API,用于创建、管理和同步线程。

1、引入pthread库

在使用pthread库之前,需要在程序中包含pthread头文件,并在编译时链接pthread库。可以通过以下代码实现:

#include <pthread.h>

在编译时,使用-lpthread选项链接pthread库:

gcc -o myprogram myprogram.c -lpthread

2、定义线程函数

线程函数是线程执行的起点,必须遵循固定的函数原型:

void *thread_function(void *arg);

thread_function是线程的入口函数,arg是传递给线程的参数,可以是任意类型的指针,通常用于传递多个参数时使用结构体。

3、创建线程

使用pthread_create函数创建新线程,函数原型如下:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
  • thread:指向线程标识符的指针。
  • attr:线程属性对象,通常为NULL使用默认属性。
  • start_routine:线程函数的指针。
  • arg:传递给线程函数的参数。

示例代码如下:

pthread_t thread_id;
pthread_create(&thread_id, NULL, thread_function, NULL);

二、初始化线程属性

线程属性允许程序员在创建线程之前对其行为进行配置,如设置线程栈大小、调度策略等。

1、创建线程属性对象

使用pthread_attr_init函数初始化线程属性对象:

pthread_attr_t attr;
pthread_attr_init(&attr);

2、设置线程属性

可以使用多个函数来设置线程属性,例如设置线程分离属性:

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

线程分离属性可以使线程在结束时自动释放资源,而不需要显式地调用pthread_join

3、销毁线程属性对象

在使用完线程属性对象后,需要销毁它以释放资源:

pthread_attr_destroy(&attr);

三、创建线程

创建线程是多线程编程的核心步骤。通过pthread_create函数,可以启动新线程并指定其入口函数和参数。

1、定义线程函数

首先定义一个线程函数,线程将在此函数中执行任务:

void *thread_function(void *arg) {
    // 线程执行的任务
    return NULL;
}

2、创建线程

使用pthread_create函数创建新线程:

pthread_t thread_id;
pthread_create(&thread_id, NULL, thread_function, NULL);

可以传递参数给线程函数,例如:

int thread_arg = 42;
pthread_create(&thread_id, NULL, thread_function, &thread_arg);

3、等待线程结束

使用pthread_join函数等待线程结束并获取其返回值:

void *result;
pthread_join(thread_id, &result);

四、同步线程

在多线程编程中,线程之间的同步非常重要,避免资源竞争和数据不一致。

1、使用互斥锁

互斥锁(mutex)用于保护共享资源,确保一次只有一个线程访问资源。使用互斥锁的步骤如下:

1.1、初始化互斥锁

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);

1.2、加锁和解锁

在访问共享资源之前加锁,访问结束后解锁:

pthread_mutex_lock(&mutex);
// 访问共享资源
pthread_mutex_unlock(&mutex);

1.3、销毁互斥锁

在不再需要互斥锁时销毁它:

pthread_mutex_destroy(&mutex);

2、使用条件变量

条件变量用于线程间的通知机制,一个线程等待特定条件,另一个线程满足条件后通知等待线程。

2.1、初始化条件变量

pthread_cond_t cond;
pthread_cond_init(&cond, NULL);

2.2、等待和通知

一个线程等待条件:

pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);

另一个线程满足条件后通知:

pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);

2.3、销毁条件变量

在不再需要条件变量时销毁它:

pthread_cond_destroy(&cond);

五、线程取消与清理

在某些情况下,需要取消正在运行的线程,并进行必要的清理工作。

1、取消线程

使用pthread_cancel函数取消线程:

pthread_cancel(thread_id);

2、线程清理

在线程中注册清理函数,确保线程取消时执行清理操作:

void cleanup(void *arg) {
    // 清理操作
}
pthread_cleanup_push(cleanup, NULL);
// 线程执行的任务
pthread_cleanup_pop(1);

六、示例程序

下面是一个完整的示例程序,演示如何使用pthread库创建和管理多线程:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void *thread_function(void *arg) {
    int *num = (int *)arg;
    printf("Thread number: %d\n", *num);
    return NULL;
}

int main() {
    pthread_t threads[5];
    int thread_args[5];
    for (int i = 0; i < 5; i++) {
        thread_args[i] = i;
        pthread_create(&threads[i], NULL, thread_function, &thread_args[i]);
    }
    for (int i = 0; i < 5; i++) {
        pthread_join(threads[i], NULL);
    }
    return 0;
}

在这个示例中,主线程创建了5个子线程,每个子线程打印其编号。主线程等待所有子线程结束后退出。通过这种方式,可以实现简单的多线程并发编程。

总结:通过使用pthread库,可以在C语言中轻松实现多线程编程。使用pthread库、初始化线程属性、创建线程、同步线程是实现多线程编程的关键步骤。通过合理地使用互斥锁和条件变量,可以有效地避免线程间的资源竞争和数据不一致问题,从而提升程序的并发性和性能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号