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日

相关文章

  • 进程和线程区别是什么 一篇文章简单介绍进程和线程的区别

    进程和线程区别是什么 基本定义 进程和线程都是计算机程序运行的基本单位。进程是CPU资源分配的独立单位,每个进程都拥有自己的地址空间、代码、数据和堆栈等资源;线程则是进程的组成部分,一个进程可以包含多个线程,它们共享进程的地址空间和资源。 区别 轻量级 相对于进程而言,线程是一个更轻量级的执行单位。因为线程共享了进程的地址空间,所以线程的创建、上下文切换等开…

    多线程 2023年5月16日
    00
  • Java让多线程按顺序执行的几种方法

    Java中多线程是独立运行的,并发执行,遵循自己的时间表。但是,有时候需要按照特定的顺序来执行多个线程,以便其运行方式与编程要求相适应。本文将介绍Java让多线程按顺序执行的几种方法。 方法1.依靠join()方法 在Java中,线程可以使用join()方法等待另一个线程的完成,直到当前线程已经结束执行或等到timeout毫秒。这个方法只能在共享同一个对象的…

    多线程 2023年5月17日
    00
  • java高并发写入用户信息到数据库的几种方法

    Java是一门支持高并发的语言,数据库的写入操作也是系统中最耗时的操作之一,因此在高并发应用场景下,如何提高写入用户信息到数据库的效率成为一个不可避免的问题。下面我们来看看Java高并发写入用户信息到数据库的几种方法。 1.多线程写入数据库 多线程可以将一个大的写入任务拆分成多个小的任务,然后并发执行,提高写入速度。例如,可以用线程池来管理多个线程,每个线程…

    多线程 2023年5月17日
    00
  • java多线程和并发包入门示例

    Java多线程和并发包入门示例是Java编程中的重要内容之一,本文将给出完整的攻略。 多线程基础知识 在理解Java多线程和并发包入门示例之前,有必要先了解一些基础知识。以下是需要掌握的关键概念: 线程:线程是在程序中的一条执行路径,和普通的程序执行是不同的。在Java中,每个线程都有一个独立的堆栈,但共享同一个内存区域。 进程:进程是正在运行中的程序的一个…

    多线程 2023年5月16日
    00
  • Tomcat+Mysql高并发配置优化讲解

    Tomcat+Mysql高并发配置优化讲解 组件简介 Tomcat是一个使用Java语言编写的开源Web应用服务器,是Apache软件基金会的一个产品。MySQL是一款关系型数据库管理系统。Tomcat+MySQL常用于开发Web应用,实现业务逻辑的处理及数据的存储。本文将介绍如何对Tomcat+MySQL进行高并发配置优化。 优化策略 Tomcat优化 调…

    多线程 2023年5月17日
    00
  • Java创建多线程局域网聊天室实例

    Java创建多线程局域网聊天室实例 本文将详细讲解如何使用Java创建多线程的局域网聊天室实例。你将学习到Java中多线程的具体实现,以及如何利用网络编程实现局域网聊天室。 线程概述 线程是计算机中最小的执行单元。在Java中,可以通过继承Thread类或实现Runnable接口的方式来创建线程。本示例中我们将使用Runnable方式创建线程。 class …

    多线程 2023年5月16日
    00
  • 线程池的原理与实现详解

    线程池的原理与实现详解 什么是线程池 线程池是一种基于线程的并发编程方式,它的基本思想是:在应用程序启动之初,就创建一定数量的线程并将它们置于一个线程池中,这些线程大多是空闲状态的,并且能够接收来自应用程序提交的工作任务。这些任务被提交给线程池之后,它们就会由池中的线程来处理。当任务执行完毕之后,线程并不会被销毁,而是将它置于池中,等待下一个任务的到来。 线…

    多线程 2023年5月16日
    00
  • python多线程互斥锁与死锁

    下面是关于“python多线程互斥锁与死锁”的详细讲解。 什么是互斥锁 在多线程编程中,如果多个线程同时对共享资源进行读写操作,可能会导致数据出现混乱或不一致的情况。为了解决这个问题,我们需要使用互斥锁(Mutex)来保证同一时刻只有一个线程访问共享资源。 互斥锁可以分为两种类型:临界区互斥锁和条件变量互斥锁。 临界区互斥锁:在程序中使用一个互斥锁对象来保护…

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