C语言中如何进行并发编程?

C语言最常用的并发编程方式是使用线程。线程是程序执行流的最小单元,多个线程可以同时并发执行不同的任务,从而提高程序的性能和响应速度。

线程的使用需要引入pthread库,包含头文件<pthread.h>。下面是实现线程的基本步骤:

  1. 创建线程:使用函数pthread_create创建子线程。该函数有四个参数,分别为线程对应的指针、线程属性、线程运行的函数和函数参数。通常只需要设置线程函数和函数参数即可,线程属性可以设置为NULL。

  2. 线程函数:线程函数是线程实际执行任务的函数,可以传递参数和返回值。线程函数的定义格式为:

void *thread_function(void *arg)
{
    // thread code
    return NULL;
}

其中,arg是线程函数的参数,可以为任何数据类型,但是必须使用指针传递,函数返回值为void*类型。

  1. 启动线程:线程创建后默认处于阻塞状态,需要使用函数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技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月27日

相关文章

  • C/C++ Qt 数据库与TableView实现多组件联动

    下面我将为你详细讲解如何使用 C/C++ Qt 实现数据库和 TableView 的联动。 准备工作 在开始之前,我们需要先准备好以下工具和环境: Qt:这是一个跨平台的 C++ 应用程序开发框架,我们将使用 Qt 来开发我们的程序。 MySQL:一个关系型数据库管理系统,我们将使用它来存储和管理我们的数据。 Qt Creator:这是一个供 Qt 开发者使…

    C 2023年5月22日
    00
  • 三维模型轻量化方面存在主要问题

    在三维模型轻量化方面,存在一些主要问题,包括: 模型细节丢失:在进行网格简化等操作时,可能会导致模型的细节丢失,使得模型失去原有的质感和细节特征。 模型形变:在进行网格简化等操作时,可能会导致模型形变,使得模型的形状和比例发生变化,影响模型的使用效果。 纹理失真:在进行纹理压缩等操作时,可能会导致纹理失真,使得模型的外观质量受到影响。 模型文件格式问题:不同…

    C语言 2023年4月18日
    00
  • 浅谈Spring @Async异步线程池用法总结

    针对“浅谈Spring @Async异步线程池用法总结”的主题,我将详细讲解如下: 1. 什么是Spring @Async异步线程池 在介绍 Spring @Async 异步线程池之前,我们需要先了解同步和异步的概念: 同步:就是一个任务执行完之后再执行下一个任务,任务按顺序一个接一个依次执行。 异步:与同步相反,异步任务的执行时间和顺序是不可预测的,任务的…

    C 2023年5月23日
    00
  • C语言实现栈的示例详解

    C语言实现栈的示例详解 栈(Stack)是一种非常重要的数据结构,在许多编程语言中都有广泛的应用。在C语言中,我们可以利用数组来实现栈数据结构。下面将介绍C语言实现栈的示例详解。 栈的结构 栈是一种线性数据结构,它具有以下特点: 后进先出(LIFO):最后压入栈的元素最先出栈; 插入(入栈)和删除(出栈)操作都在栈顶进行。 示意图如下: |_______| …

    C 2023年5月23日
    00
  • MySQL系列之开篇 MySQL关系型数据库基础概念

    MySQL系列之开篇 MySQL关系型数据库基础概念 什么是关系型数据库? 关系型数据库是最为常见的数据库类型,它使用了表格来存储数据,每个表格都有一个唯一的名字,并且由一个或多个列组成。 在关系型数据库中,表格之间可以相互关联,从而形成一个关系型的数据模型。 关系型数据库的优点 简单易学,广泛使用。 数据之间的关系清晰。 可靠性、稳定性好。 支持事务处理,…

    C 2023年5月22日
    00
  • C++ 智能指针的模拟实现实例

    C++智能指针的模拟实现实例 简介 在C++中,有一种叫做智能指针的类型,它的作用是自动管理指针资源,避免内存泄漏等问题。C++智能指针是C++11标准引入的一个新特性,包括了unique_ptr、shared_ptr、weak_ptr三种智能指针。本文将介绍C++智能指针的模拟实现方式,让各位读者了解智能指针的本质和实现方式,从而更好地应用智能指针。 un…

    C 2023年5月23日
    00
  • C语言实现飞机大战小游戏完整代码

    C语言实现飞机大战小游戏完整代码攻略 游戏简介 飞机大战游戏是一款飞行射击类的小游戏,主要玩家在游戏中扮演一位勇敢的飞行员,驾驶战斗机与敌军进行激烈的空中战斗,打击敌人并获取高分。 必要工具 C语言编译环境 简单的图形库,以下是WinBGIm的链接:http://www.lerner.co.il/wp-content/uploads/2014/04/WinB…

    C 2023年5月24日
    00
  • C++简单又轻松的讲解类和对象中友元函数

    C++中类和对象中的友元函数是一个非常重要的概念,下面我将为大家详细讲解,包括什么是友元函数、如何使用友元函数以及友元函数的作用。 什么是友元函数? 友元函数是在类的外部定义的,但是它能够访问类的私有数据成员。例如,一个类中的成员函数可以访问该类的私有数据成员,而友元函数也可以访问该类的私有数据成员,因此它就被称为友元函数。 在C++中,友元函数有两种类型:…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部