Linux 多线程编程实例

针对“Linux 多线程编程实例”的完整攻略,我为你提供以下内容:

Linux 多线程编程的基础知识

进程与线程的概念

进程是资源分配的最小单位,线程是 CPU 调度的最小单位。

线程的优缺点

线程的优点在于线程的创建、销毁、上下文切换等开销相对较小,可以充分利用 CPU 资源,提高程序的并发性能,而缺点在于线程之间共享内存时需要进行同步和协调,比较容易出现死锁和竞争等问题。

线程的基本操作

线程的基本操作包括创建、销毁和同步等,其中使用 pthread 库可方便实现。

实例说明

示例一:计算 1 ~ 100 的和

如下为示例代码:

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

void* thread_func(void* arg) // 线程执行函数
{
    int sum = 0;
    for (int i = 1; i <= 100; ++i) {
        sum += i;
    }
    printf("thread sum = %d\n", sum);
    return NULL;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, NULL, thread_func, NULL); // 创建线程
    printf("main thread\n");
    pthread_join(tid, NULL); // 等待线程执行完成
    return 0;
}

以上示例中,创建了一个线程,线程执行函数为计算 1 ~ 100 的和,主线程则输出“main thread”,并等待子线程执行完成。最终输出结果为:

main thread
thread sum = 5050

示例二:生产者、消费者模型

如下为示例代码:

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

#define BUFFER_SIZE 10 // 缓冲区大小

int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0, out = 0; // 缓冲区读写指针
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void* producer_func(void* arg) // 生产者线程执行函数
{
    for (int i = 1; i <= 20; ++i) {
        pthread_mutex_lock(&mutex);
        while ((in + 1) % BUFFER_SIZE == out) {
            printf("buffer is full\n");
            pthread_cond_wait(&cond, &mutex); // 等待,直到缓冲区非满
        }
        buffer[in] = rand() % 1000;
        printf("producer: %d, buffer[%d] = %d\n", i, in, buffer[in]);
        in = (in + 1) % BUFFER_SIZE;
        pthread_cond_signal(&cond); // 通知消费者线程,缓冲区非空
        pthread_mutex_unlock(&mutex);
        sleep(1); // 睡眠,模拟生产过程
    }
    return NULL;
}

void* consumer_func(void* arg) // 消费者线程执行函数
{
    for (int i = 1; i <= 20; ++i) {
        pthread_mutex_lock(&mutex);
        while (in == out) {
            printf("buffer is empty\n");
            pthread_cond_wait(&cond, &mutex); // 等待,直到缓冲区非空
        }
        int data = buffer[out];
        printf("consumer: %d, buffer[%d] = %d\n", i, out, data);
        out = (out + 1) % BUFFER_SIZE;
        pthread_cond_signal(&cond); // 通知生产者线程,缓冲区非满
        pthread_mutex_unlock(&mutex);
        sleep(1); // 睡眠,模拟消费过程
    }
    return NULL;
}

int main()
{
    pthread_t producer_tid, consumer_tid;
    pthread_create(&producer_tid, NULL, producer_func, NULL); // 创建生产者线程
    pthread_create(&consumer_tid, NULL, consumer_func, NULL); // 创建消费者线程
    pthread_join(producer_tid, NULL); // 等待生产者线程执行完成
    pthread_join(consumer_tid, NULL); // 等待消费者线程执行完成
    return 0;
}

以上示例为利用生产者、消费者模型实现线程间通信,其中生产者线程负责向缓冲区生产数据,消费者线程从缓冲区消费数据。在代码实现时,缓冲区使用数组实现,同时使用 mutex 和 cond 实现线程同步和互斥。最终输出结果为:

producer: 1, buffer[0] = 658
consumer: 1, buffer[0] = 658
producer: 2, buffer[1] = 753
consumer: 2, buffer[1] = 753
producer: 3, buffer[2] = 867
consumer: 3, buffer[2] = 867
producer: 4, buffer[3] = 64
consumer: 4, buffer[3] = 64
producer: 5, buffer[4] = 259
consumer: 5, buffer[4] = 259
producer: 6, buffer[5] = 285
consumer: 6, buffer[5] = 285
producer: 7, buffer[6] = 882
consumer: 7, buffer[6] = 882
producer: 8, buffer[7] = 361
consumer: 8, buffer[7] = 361
producer: 9, buffer[8] = 919
consumer: 9, buffer[8] = 919
producer: 10, buffer[9] = 883
consumer: 10, buffer[9] = 883
producer: 11, buffer[0] = 885
consumer: 11, buffer[0] = 885
producer: 12, buffer[1] = 560
consumer: 12, buffer[1] = 560
producer: 13, buffer[2] = 2
consumer: 13, buffer[2] = 2
producer: 14, buffer[3] = 497
consumer: 14, buffer[3] = 497
producer: 15, buffer[4] = 889
consumer: 15, buffer[4] = 889
producer: 16, buffer[5] = 998
consumer: 16, buffer[5] = 998
producer: 17, buffer[6] = 828
consumer: 17, buffer[6] = 828
producer: 18, buffer[7] = 936
consumer: 18, buffer[7] = 936
producer: 19, buffer[8] = 143
consumer: 19, buffer[8] = 143
producer: 20, buffer[9] = 825
consumer: 20, buffer[9] = 825

以上就是“Linux 多线程编程实例”的完整攻略,同时提供了两个不同的示例说明,希望可以帮到你。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux 多线程编程实例 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 深入理解java线程通信

    以下是关于深入理解Java线程通信的完整攻略: 背景介绍 在多线程编程中,线程间的数据共享和通信是非常重要的部分。线程需要通过某种机制来共享数据和信息,以便使它们之间达成一致并协调完成任务。 Java提供了多种实现线程通信的机制,如synchronized,wait和notify等。理解这些机制是Java多线程编程的重要基础,下面将对这些机制进行详细的介绍和…

    多线程 2023年5月17日
    00
  • Spring Boot中配置定时任务、线程池与多线程池执行的方法

    下面是Spring Boot中配置定时任务、线程池与多线程池执行的完整攻略: 定时任务 配置定时任务 使用Spring Boot配置定时任务十分方便,只需要使用 @Scheduled 注解即可。 @Component public class MyTask { @Scheduled(fixedDelay = 5000) //间隔5秒执行 public voi…

    多线程 2023年5月16日
    00
  • Java基础之并发相关知识总结

    Java基础之并发相关知识总结 什么是并发? 并发是指多个线程在特定的时间段内运行,并且在同一个进程内共享资源。本质上,线程是 CPU 执行计算任务的最小单位,CPU 在多个线程之间切换运行,从而实现并发执行多个任务,提高系统的效率和吞吐量。 什么是线程? 线程是进程内部并发执行的一条路径,也是执行的最小单位。在 Java 中,一个程序至少有一个主线程,主线…

    多线程 2023年5月17日
    00
  • Python 多进程、多线程效率对比

    当需要提高 Python 程序执行效率时,很多程序员会考虑使用多线程或多进程技术来并行地执行任务。这两种技术都可以提高程序的并发能力,但是它们的实现方式和适用场景都有所不同。 在使用多线程和多进程之前,需要先了解它们的区别和联系。 多进程与多线程的区别 多进程:每个进程拥有独立的内存空间以及系统资源,进程之间的通信需要进行 IPC(进程间通信),因此开销比较…

    多线程 2023年5月16日
    00
  • c# 多线程编程 入门篇

    C# 多线程编程入门攻略 本文主要介绍C#多线程编程的基础知识,包括如何创建和启动线程、锁定和解锁等常用操作。 创建和启动线程 在线程编程中,可以使用Thread类来创建和启动线程。创建Thread对象时需要传入一个ThreadStart委托对象,它指定了线程执行的入口点。 示例代码: using System; using System.Threading…

    多线程 2023年5月17日
    00
  • java并发编程专题(十一)—-(JUC原子类)数组类型详解

    Java并发编程专题(十一)—-(JUC原子类)数组类型详解 1. 前言 Java并发编程主要使用锁、volatile和原子操作三种方式来保证线程安全。而在这三种方式中,原子操作是性能最优秀、最方便的一种。而在原子操作中,JUC原子类是最常用的一种。 本篇文章将主要讨论JUC原子类中的数组类型,即AtomicIntegerArray、AtomicLong…

    多线程 2023年5月16日
    00
  • Java并发程序刺客之假共享的原理及复现

    Java并发程序刺客之假共享 1. 假共享的概念 假共享(False sharing)是指多个线程访问共享内存中不同的变量,但它们彼此之间共享了同一个缓存行(cache line),这样就会频繁地触发缓存一致性协议,导致性能下降。 缓存一致性协议(Coherence protocol)是指在多个处理器/核心之间共享缓存的时候保持数据一致的一种协议。常见的协议…

    多线程 2023年5月16日
    00
  • 同步多线程(SMT)是什么意思?有什么作用?

    同步多线程(SMT)是指在计算机系统或处理器架构中支持在一个物理处理器核心上同时运行多个执行线程的技术。这是通过将单个物理处理器核心的资源分配给多个线程来实现的,使得每个线程都可以访问并执行指令,从而提高处理器的吞吐量和执行能力。SMT的实质是在物理上使用了多个逻辑CPU,在逻辑CPU之间切换来掩盖处理器中资源的闲置,从而提高了处理能力。 SMT的主要优点是…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部