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语言算法优化攻略 1. 使用基本数据类型 在编写C语言算法时,应尽可能使用基本数据类型,避免使用浮点数和双精度浮点数,因为基本数据类型的处理速度更快。例如,可以使用整数代替小数进行计算,使用位运算代替乘除法等。 2. 减少循环嵌套 循环嵌套是C语言中实现算法的基础,但也是最容易导致程序性能瓶颈的地方。因此,在编写算法时应尽可能减少循环嵌套,避免不必要的复杂…

    C 2023年4月27日
    00
  • PHP+JQUERY操作JSON实例

    关于“PHP+JQUERY操作JSON实例”的完整攻略,我会从以下几个方面进行详细讲解: 什么是JSON 如何使用PHP操作JSON 如何使用JQUERY操作JSON 示例说明 1. 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,很多前端开发人员都会使用JSON来传输数据,特别是在AJAX中经常使…

    C 2023年5月22日
    00
  • 适合初学者练习的C语言实现三子棋小游戏

    适合初学者练习的C语言实现三子棋小游戏完整攻略 三子棋是一款简单的棋盘游戏,它的规则简单易懂,被广泛地应用于人机交互、智力测试等领域。下面是如何使用C语言实现三子棋小游戏的完整攻略: 步骤一:确定游戏规则 首先,我们需要确定游戏规则,确保实现的游戏规则正确,符合三子棋的规则,如: 游戏双方执黑子和白子 执黑子先走 棋盘为3 x 3 的方格状 玩家操作后棋子不…

    C 2023年5月23日
    00
  • C 标准库 string.h

    C 标准库 string.h 提供了一系列字符串操作函数,可以在 C 语言程序中方便地进行字符串处理。下面将依次介绍这些函数的使用方法。 strcpy char* strcpy(char* dest, const char* src); 将字符串 src 复制到字符串 dest,并返回 dest。需要注意的是,函数会复制字符串到 dest 的末尾,并在末尾加…

    C 2023年5月10日
    00
  • C/C++ 连接MySql数据库的方法

    连接MySQL数据库是C/C++开发人员需要掌握的一项基础技能。下面是连接MySQL数据库的方法: 安装MySQL连接库 要使用C/C++连接MySQL数据库,首先需要安装MySQL连接库。具体的安装步骤可以参考官方文档。在Linux系统下,可以使用以下命令安装: sudo apt-get install libmysqlclient-dev 连接MySQL…

    C 2023年5月22日
    00
  • C语言 strcspn()函数

    下面是关于C语言中strcspn()函数的完整使用攻略。 strcspn()函数介绍 strcspn()函数是一个C语言标准库函数,用于查找字符串中第一个不在另一个字符串中出现的字符的位置,并返回该位置。 函数原型如下: size_t strcspn(const char *str1, const char *str2); 它的第一个参数为要查找的字符串,第…

    C 2023年5月9日
    00
  • C语言职工管理系统设计

    C语言职工管理系统设计攻略 目录 概述 界面设计 功能设计 代码实现 示例说明 总结 1. 概述 C语言职工管理系统设计是一个基于控制台的应用程序,旨在设计一个能够管理职工信息的管理系统,方便管理员有效地管理职工信息。 本系统的主要功能包括:添加职工、显示职工、删除职工、修改职工、查找职工、排序职工等。 2. 界面设计 首先,需要针对系统的功能进行界面设计,…

    C 2023年5月23日
    00
  • C语言实现简单员工工资管理系统

    C语言实现简单员工工资管理系统 简介 本文旨在介绍如何使用C语言实现一个简单的员工工资管理系统。该系统可以用于输入员工基本信息,录入工资数据和计算每个员工的工资。其主要功能模块包括:输入员工基本信息、录入工资数据、计算员工工资、显示员工工资信息。 基本功能 输入员工基本信息:包括员工的姓名、性别、年龄、工龄等信息。 示例代码: “`c struct emp…

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