线程---实践与技巧(C语言)

news/2024/9/19 12:14:35 标签: 算法, 开发语言, c语言

        

目录

一、引言

二、线程基础

   1.线程概念

   2.线程库

三、线程的创建与终止

   1.创建线程

   2.终止线程

四、线程同步与互斥

   1.互斥锁(Mutex)

   2.条件变量(Condition Variable)

五、线程间的通信

六、总结        


        本文将详细介绍C语言中线程的使用方法,探讨线程的创建、同步、互斥以及线程间的通信等关键技术。通过实际案例,帮助读者掌握C语言线程编程的核心技巧,为高效并发编程打下坚实基础。

一、引言

        在当今多核处理器普及的时代,多线程编程已经成为提高程序性能的重要手段。C语言由于其高性能和底层操作能力,在多线程编程领域有着广泛的应用。本文将带领读者深入了解C语言中的线程编程。

二、线程基础

   1.线程概念

        线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是轻量级的执行流。与进程相比,线程的创建和销毁开销更小,线程间切换速度更快。

   2.线程库

        在C语言中,我们通常使用POSIX线程库(pthread)来进行线程的创建和管理。要使用pthread库,需要在编译时链接pthread库。

gcc -o thread_example thread_example.c -lpthread

三、线程的创建与终止

   1.创建线程

使用pthread_create函数可以创建一个新的线程。

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                  void *(*start_routine) (void *), void *arg);

示例代码:

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

void* thread_function(void* arg) {
    printf("Hello from the thread!\n");
    return NULL;
}

int main() {
    pthread_t thread_id;
    if (pthread_create(&thread_id, NULL, thread_function, NULL) != 0) {
        perror("pthread_create");
        return 1;
    }
    pthread_join(thread_id, NULL);
    return 0;
}

   2.终止线程

线程可以通过以下方式终止:

  • 从线程函数返回,返回值是线程的退出码。
  • 被同一进程中的其他线程取消。
  • 调用pthread_exit函数。

四、线程同步与互斥

   1.互斥锁(Mutex)

互斥锁用于保证共享资源在同一时间只能被一个线程访问。

#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

   2.条件变量(Condition Variable)

条件变量用于线程间的同步,允许线程在某些条件下挂起或被唤醒。

#include <pthread.h>

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_signal(pthread_cond_t *cond);

五、线程间的通信

        线程间的通信可以通过共享内存、互斥锁、条件变量等方式实现。以下是一个使用互斥锁和条件变量进行线程间通信的例子:

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

pthread_mutex_t mutex;
pthread_cond_t cond;
int count = 0;

void* producer(void* arg) {
    for (int i = 0; i < 10; ++i) {
        pthread_mutex_lock(&mutex);
        count++;
        printf("Produced %d\n", count);
        pthread_mutex_unlock(&mutex);
        pthread_cond_signal(&cond);
        sleep(1);
    }
    return NULL;
}

void* consumer(void* arg) {
    while (1) {
        pthread_mutex_lock(&mutex);
        if (count == 0) {
            pthread_cond_wait(&cond, &mutex);
        }
        if (count > 0) {
            count--;
            printf("Consumed %d\n", count + 1);
        }
        pthread_mutex_unlock(&mutex);
        if (count == 0) break;
    }
    return NULL;
}

int main() {
    pthread_t prod, cons;

    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    pthread_create(&prod, NULL, producer, NULL);
    pthread_create(&cons, NULL, consumer, NULL);

    pthread_join(prod, NULL);
    pthread_join(cons, NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    return 0;
}

六、总结        

        本文详细介绍了C语言中线程编程的基础知识和实践技巧,包括线程的创建、同步、互斥以及线程间的通信。通过掌握这些技术,开发者可以更加高效地利用多核处理器资源,编写高性能的并发程序。在实际应用中,应根据具体场景选择合适的同步机制,确保线程安全。希望本文能够为您的C语言线程编程之旅提供帮助。


http://www.niftyadmin.cn/n/5662522.html

相关文章

红外图像车辆与行人检测系统源码分享

红外图像车辆与行人检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Co…

kaggle竞赛(Deepfake检测)的核心流程【notebook 运行演示】

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 notebook 链接 从kaggle竞赛零基础上手CV实战 kaggle竞赛&#xff08;Deepfake检测&#xff09;的核心流程 赛题介绍环境配置&#xff08;准备工作&#xff09;数据集神经网络/深度学习的组成元素训练策略/训练…

Linux 文件 IO 管理(第一讲)

Linux 文件 IO 管理&#xff08;第一讲&#xff09; 回顾 C 语言文件操作&#xff0c;提炼理解新创建的文件为什么被放在可执行文件的同级目录下&#xff1f;上述 log.txt 何时被创建&#xff1f;又是谁在打开它&#xff1f;那文件没有被打开的时候在哪里&#xff1f;一个进程可…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于变电站容量概率规划的分布式电源可信度和有源配电网容载比计算分析 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

胡学乱想----前端知识点(css色彩)

1. margin 属性 简写 margin 属性有两个值时&#xff0c;它将 margin-top 和 margin-bottom 设置为第一个值&#xff0c;并将 margin-left 和 margin-right 设置为第二个值 .marker {width: 200px;height: 25px;background-color: red;margin: 10px auto; }2. rgb 属性 CSS…

MySQL篇(高级字符串函数/正则表达式)(持续更新迭代)

目录 讲点一&#xff1a;高级字符串函数 一、简介 二、常见字符串函数 1. CONCAT() 2. SUBSTRING() 3. LENGTH() 4. REPLACE() 5. TRIM() 6. UPPER() 7. LOWER() 8. LEFT() 9. RIGHT() 10. INSTR() 11. LENTH(str) 讲点二&#xff1a;正则表达式 一、简介 二、…

One API 部署与配置指南

技术文档&#xff1a;One API 部署与配置指南 概述 One API 是一个多功能的 API 管理平台&#xff0c;支持自定义设置、用户管理、多种登录注册方式、主题切换等。本文档提供了详细的部署和配置指南&#xff0c;帮助用户快速搭建和使用 One API。 部署 基于 Docker 部署 D…

【计算机网络】数据链路层深度解析

概述三个重要问题封装成帧差错检测可靠传输 使用广播信道的数据链路层数据链路层的互连设备 媒体接入MAC地址集线器与交换机区别以太网交换机生成树协议STP 概述 链路就是从一个结点到相邻结点的一段物理线路&#xff0c;而中间没有任何其他的交换结点。数据链路是指把实现通信…