首页 > 其他分享 >线程---实践与技巧(C语言)

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

时间:2024-09-12 17:49:03浏览次数:12  
标签:线程 C语言 --- 互斥 mutex pthread cond NULL

        

目录

一、引言

二、线程基础

   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语言线程编程之旅提供帮助。

标签:线程,C语言,---,互斥,mutex,pthread,cond,NULL
From: https://blog.csdn.net/2201_75782847/article/details/142182266

相关文章

  • KubeSphere 社区双周报| 2024.08.30-09.12
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.08.30-09.12。贡献者名单近期重要更新KubeSphereK......
  • 【2024-09-11】娃有诉求
    20:00天可补,海可填,南山可移。日月既往,不可复追。                                              ——曾国藩昨晚下班回到家已经晚上11点了,客厅灯是关着的,说明孩子们跟奶奶都......
  • tomcat线程池满了会影响redis请求吗
    Tomcat线程池满了会影响处理新来的HTTP请求,但通常不会直接影响Redis的请求,因为这两者在系统架构中是分离的组件。以下是相关的解释:Tomcat线程池Tomcat服务器使用线程池来处理并发到达的HTTP请求。每个请求都会消耗线程池中的一个线程。如果线程池达到其最大容量,新到达的请求可能会......
  • Java Executors类的9种创建线程池的方法及应用场景分析
    在Java中,Executors类提供了多种静态工厂方法来创建不同类型的线程池。在学习线程池的过程中,一定避不开Executors类,掌握这个类的使用、原理、使用场景,对于实际项目开发时,运用自如,以下是一些常用的方法,一一细说:newCachedThreadPool():创建一个可缓存的线程池,如果线程池中的......
  • PHP体检信息管理系统-计算机毕业设计源码54850
    目录1绪论1.1选题背景1.2选题意义1.3研究的主要内容1.4论文结构与章节安排2系统分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3操作可行性分析2.2系统流程分析2.2.1数据新增流程2.2.2 数据删除流程2.3 系统功能分析2.3.1功能性分析2.......
  • DBA-MySQL巡检报告 模版
    DBA-MySQL巡检报告模版 -20240912——————————————————————————————————————————————————————————----2024年9月12日17:02:13----bayaim----以下内容纯属个人原创,纯属个人多年经验总结,非喜勿喷,----本巡检报告......
  • 面试-JS Web API
    手写一个简易的Ajax跨域的常用实现方式GET请求//创建一个XMLHttpRequest对象constxhr=newXMLHttpRequest();//初始化一个GET请求//第三个参数true表示异步,一般都为truexhr.open('GET','/data/test.json',true);//设置事件处理函数,当readyState......
  • linux管理命令-7
    RPM软件包简介RPM包文件名特征软件名-版本信息.操作系统.硬件架构.rpmfirefox-91.9.0-1.el8_5.x86_64.rpm软件名:firefox软件包名:firefox-91.9.0-1.el8_5.x86_64.rpm[root@nb~]# mount  /dev/cdrom    /mntmount:/dev/sr0写保护,将以只读方式挂载[root@nb~]# ls  /m......
  • 计算机专业毕设推荐-基于Java的个人健康运动饮食记录小程序
    精彩专栏推荐订阅:在下方专栏......
  • 【读书笔记-《30天自制操作系统》-18】Day19
    本篇内容涉及到文件与文件系统,以及应用程序的运行。首先实现type命令,读取文件并显示;接下来导入对FAT文件系统的支持,实现读取大小512字节以上,存放在不连续扇区中的文件。在此基础上,最终实现读取并运行应用程序。1.type命令实现type命令是Windows命令行中用于读取并显示文......