Linux中多线程详解及简单实例

Linux中多线程详解及简单实例

简介

在Linux系统下,多线程是一种常见的编程方法,能够有效提高程序的运行效率。本篇文章将从多线程的概念、使用方法以及简单实例展开讨论。

多线程概念

多线程是指在一个进程(process)内部,存在多个独立运行的线程(thread),每个线程都有自己的执行序列和程序计数器。多线程可以利用多核CPU并行处理任务,提高程序的运行效率。另外,多线程之间共享进程的资源,包括变量、文件等,相比于多进程通信的成本更低。

多线程使用方法

头文件和编译选项

使用多线程需要包含pthread.h头文件,并在编译时添加-lpthread选项,例如:

gcc -o output program.c -lpthread

创建线程

在Linux系统中,使用pthread_create函数创建线程,其定义如下:

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

参数说明:
- thread:创建的线程ID
- attr:线程的属性,如果为NULL则使用默认属性
- start_routine:线程执行函数,该函数的返回值必须为void*
- arg:传递给start_routine的参数

等待线程

使用pthread_join函数等待线程结束,其定义如下:

int pthread_join(pthread_t *thread, void **retval);

参数说明:
- thread:指定要等待结束的线程ID
- retval:线程返回值,如果不关心则传递NULL

线程退出

如果需要在线程执行结束后退出线程,需要使用pthread_exit函数,其定义如下:

void pthread_exit(void *retval);

参数说明:
- retval:线程的返回值

多线程示例

下面将通过两个示例分别进行演示。

示例一:计算1-100的和

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

void *sum(void *param) {
    int result = 0;
    int i;
    for(i = 1; i <= 100; i++)
        result += i;
    pthread_exit((void *)result);
}

int main(int argc, char *argv[]) {
    pthread_t tid;
    void *status;
    pthread_create(&tid, NULL, sum, NULL);
    pthread_join(tid, &status);
    printf("Sum is %d.\n", (int)status);
    return 0;
}

该示例中,我们使用pthread_create函数创建了一个新线程,执行sum函数计算1-100的和,然后通过pthread_join函数等待线程结束并获取线程返回值,最后输出计算结果。

示例二:两个线程交替输出

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

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

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

void *func2(void *arg) {
    int i;
    for(i = 2; i <= 10; i += 2) {
        pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond, &mutex);
        printf("%d\n", i);
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}

int main(int argc, char *argv[]) {
    pthread_t tid1, tid2;
    pthread_create(&tid1, NULL, func1, NULL);
    pthread_create(&tid2, NULL, func2, NULL);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    return 0;
}

该示例中,我们创建了两个线程,分别执行func1和func2函数,这两个函数将交替输出1~10之间的偶数和奇数。使用pthread_mutex_lock和pthread_mutex_unlock函数保证每次只有一个线程能够输出,使用pthread_cond_wait和pthread_cond_signal实现线程之间的同步。

总结

本篇文章详细讲解了Linux中多线程的概念、使用方法以及两个简单的示例。多线程是一种常见的编程方式,它可以提高程序运行效率,但同时也需要开发者注意线程之间的同步与互斥。

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

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

相关文章

  • C++中线程池ThreadPool源码解析

    C++中线程池ThreadPool源码解析 线程池ThreadPool的概念和作用 线程池ThreadPool的作用是管理和复用线程,减少线程的创建和销毁对时间和资源的消耗,提高程序的执行效率和性能。线程池由一组可重用的线程构成,线程生命周期由线程池管理,充分利用CPU资源,提高任务处理速度。 线程池ThreadPool在并发编程中应用广泛,被用于处理网络请…

    多线程 2023年5月16日
    00
  • java中Redisson的看门狗机制的实现

    Redisson是基于Redis实现的分布式对象服务的Java客户端,支持众多的分布式锁和数据结构。Redisson提供了看门狗机制,可以保证分布式锁的安全性和可靠性。下面是Java中Redisson的看门狗机制的实现完整攻略。 什么是Redisson的看门狗机制 Redisson的看门狗机制是在获取锁时,同时启动一个看门狗线程,定时续期锁的时间。当锁的过期…

    多线程 2023年5月17日
    00
  • Kotlin协程与并发深入全面讲解

    Kotlin协程与并发深入全面讲解 什么是Kotlin协程 Kotlin协程是一种轻量级的、并发的、以及非阻塞的编程模式,它可以让我们在某些场景下更加有效地利用线程资源实现异步编程。 Kotlin协程的特点 能够高效地使用线程资源,避免了线程的频繁创建与销毁 简洁、灵活、易用 同步与异步代码的无缝转换,提供了统一的编程模型 支持取消操作,使其可以更好地处理长…

    多线程 2023年5月16日
    00
  • Python基于gevent实现高并发代码实例

    Python基于gevent实现高并发代码实例 1. 前言 在网络编程中,我们经常会遇到高并发的情形,即有大量的请求同时涌向服务器,需要服务器能够快速响应并处理这些请求。在 Python 中,我们可以使用多线程或多进程等方式来实现高并发,但是这些方式在一定程度上会影响程序的性能。 这时,使用协程来实现高并发就是一个好的方案。Python 中有很多支持协程的第…

    多线程 2023年5月16日
    00
  • 浅谈并发处理PHP进程间通信之外部介质

    浅谈并发处理PHP进程间通信之外部介质 背景 在高并发的场景下,PHP进程间通信是很重要的, 因为PHP本质上是单线程应用,如果要处理多个请求就需要创造多个子进程来处理。这就要求子进程之间需要有通信渠道,一方面,可以让子进程之间共享信息;另一方面,可以避免死锁和资源竞争。本文主要介绍并发处理PHP进程间通信之外部介质。 方案 实现PHP进程间通信的方法主要有…

    多线程 2023年5月17日
    00
  • Java 浅谈 高并发 处理方案详解

    Java浅谈高并发处理方案详解 前言 随着互联网的发展和用户访问量的逐步增加,高并发逐渐成为互联网开发中的常见问题。而 Java 作为一门流行的编程语言,其处理高并发问题的方案也备受关注。本篇文章将浅谈 Java 高并发处理方案,并且给出两个对高并发处理方案的具体示例。 常用的高并发处理方案 多线程 多线程是 Java 中常用的高并发解决方案。可以通过创建多…

    多线程 2023年5月16日
    00
  • java并发编程专题(一)—-线程基础知识

    让我来详细讲解“Java并发编程专题(一)—-线程基础知识”的完整攻略。 一、为什么要学习线程基础知识? 线程是程序并发执行的最小单位。在多核CPU的情况下,线程可以充分利用CPU的资源,提高程序的执行速度。 Java作为一种面向对象编程语言,线程是Java中最基本的类之一。学习线程基础知识,有助于掌握Java的基本语法和面向对象编程思想。 现代软件开发…

    多线程 2023年5月16日
    00
  • PHP细数实现提高并发能力的方法

    PHP细数实现提高并发能力的方法 1. 使用多线程 在PHP中,使用多线程技术可以有效提高并发能力。多线程技术可以将程序的运行分为多个部分同时执行,从而最大限度地利用CPU资源。 PHP原生虽然不支持多线程,但可以使用扩展库来实现。目前比较常见的扩展库有pthreads和pcntl。 以下是一个使用pthreads扩展库实现多线程的示例: <?php …

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