详解Linux多线程编程(不限Linux)

详解Linux多线程编程

Linux是一种非常流行的操作系统,因其良好的多线程支持而在并发编程场景中应用广泛。本篇文章将详细讲解如何在Linux环境下进行多线程编程。

基础知识

在Linux环境下,线程使用pthread库进行创建和控制。该库包含以下头文件:

#include <pthread.h>

线程的创建方法如下:

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

其中,第一个参数指向pthread_t类型的指针,表示新创建的线程的唯一标识符。第二个参数可以指定线程的属性,如果使用默认属性可以传入NULL。第三个参数指向一个函数指针,表示新线程启动时要执行的函数。最后一个参数是传递给函数的参数。

线程的销毁方法如下:

int pthread_cancel(pthread_t thread);

其中,参数指定要终止的线程的标识符。

示例1:创建和销毁线程

下面是一个简单的多线程示例,该示例创建了一个新线程,并在新线程中循环输出“Hello, World!”,主线程则循环输出“Main Thread”。

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

void* thread_func(void* arg) {
    for (int i = 0; i < 5; i++) {
        printf("Hello, World!\n");
    }
    return NULL;
}

int main() {
    pthread_t tid;
    if (pthread_create(&tid, NULL, thread_func, NULL) != 0) {
        printf("Failed to create thread!\n");
        return -1;
    }
    for (int i = 0; i < 5; i++) {
        printf("Main Thread\n");
    }
    if (pthread_cancel(tid) != 0) {
        printf("Failed to cancel thread!\n");
        return -1;
    }
    return 0;
}

该示例中,新线程中的函数使用了一个for循环来输出“Hello, World!”,主线程则也使用了一个for循环来输出“Main Thread”。最后,主线程调用pthread_cancel函数终止新线程的执行。

示例2:线程间的同步

多线程编程中存在线程间竞争的问题,需要使用同步机制来避免。Linux环境中提供了多种同步机制,本例以互斥锁为例说明。

互斥锁用于保护多个线程对共享资源的访问,它必须被锁定和解锁操作包围。下面是一个使用互斥锁的示例。

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

pthread_mutex_t count_mutex;
int count = 0;

void* thread_func(void* arg) {
    for (int i = 0; i < 5; i++) {
        pthread_mutex_lock(&count_mutex);
        count++;
        printf("Thread %d, count = %d\n", *(int*)arg, count);
        pthread_mutex_unlock(&count_mutex);
    }
    return NULL;
}

int main() {
    pthread_mutex_init(&count_mutex, NULL);
    pthread_t tid1, tid2;
    int arg1 = 1, arg2 = 2;
    if (pthread_create(&tid1, NULL, thread_func, &arg1) != 0) {
        printf("Failed to create thread 1!\n");
        return -1;
    }
    if (pthread_create(&tid2, NULL, thread_func, &arg2) != 0) {
        printf("Failed to create thread 2!\n");
        return -1;
    }
    if (pthread_join(tid1, NULL) != 0) {
        printf("Failed to join thread 1!\n");
        return -1;
    }
    if (pthread_join(tid2, NULL) != 0) {
        printf("Failed to join thread 2!\n");
        return -1;
    }
    pthread_mutex_destroy(&count_mutex);
    return 0;
}

该示例中,两个线程分别对count变量进行累加,使用互斥锁保护了共享资源的访问。主线程使用pthread_join函数等待两个线程的执行结束,最后销毁了互斥锁。

总结

本篇文章介绍了Linux环境下多线程编程的基础知识和示例,内容包括线程的创建和销毁、线程间的同步机制等。希望可以帮助读者顺利进行多线程编程。

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

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Redis集群的关闭与重启操作

    Redis集群的关闭与重启操作过程如下: 1. 关闭Redis集群 1.1 单个节点关闭 可使用如下命令关闭单个节点: redis-cli -p port shutdown 其中,port为该节点的端口号,执行该命令后,该节点将会被关闭。 1.2 整个集群关闭 若需要关闭整个Redis集群,可按如下步骤进行: 首先停止Redis客户端的对外服务 然后逐个停止…

    other 2023年6月27日
    00
  • React状态更新的优先级机制源码解析

    React状态更新的优先级机制源码解析 1. 状态更新的原理概述 在React中,组件状态的更新是通过调用setState方法来触发的。但是,React并不会立即更新组件的状态,而是先将状态更新请求加入一个更新队列,并根据一定的优先级机制来批量处理这些更新请求。 React使用任务调度器来管理状态更新的优先级,通过不同的优先级来划分任务的处理顺序,可以确保在…

    other 2023年6月28日
    00
  • Android调用系统图库获取图片的方法

    以下是关于Android调用系统图库获取图片的方法的完整攻略: 在AndroidManifest.xml文件中添加读取外部存储权限: <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" /> 在Activity中添加调用系统图库的…

    other 2023年10月14日
    00
  • Windows无线网络设置导出及导入教程适用于Win7及XP

    Windows无线网络设置导出及导入教程 Windows无线网络设置可以通过导出和导入的方式方便地进行迁移和备份。本教程介绍了在Windows 7和Windows XP系统中进行无线网络设置的导入和导出。 一、导出无线网络设置 进入“控制面板”,找到并点击“网络和共享中心”。 点击“管理无线网络”链接,在弹出的窗口中选择您需要导出的无线网络。 单击鼠标右键,…

    other 2023年6月27日
    00
  • 魅蓝note无限重启是什么原因?如何解决?

    魅蓝note无限重启是什么原因?如何解决? 魅蓝note无限重启是指魅族手机开机后无法正常进入系统,反复出现重启的情况。这可能是由多种因素引起的,包括软件故障、硬件故障、系统崩溃等。 以下是解决魅蓝note无限重启的完整攻略: 一、清除缓存和数据 1.1 清除缓存 清除缓存可以解决一些常见的手机问题。操作步骤如下: 关机 按住“音量+”和“开机键”同时按下,…

    other 2023年6月27日
    00
  • 创建python文件夹检查它是否已经存在

    以下是关于“创建Python文件夹并检查它是否已经存在”的完整攻略,包含两个示例说明。 创建Python文件夹并检查它是否已经存在 在Python,我们可以使用os模块来创建文件夹并检查它是否已经存在。以下是一个示例: import os folder_name = "my_folder" if not os.path.exists(fo…

    other 2023年5月9日
    00
  • jQuery的初始化与对象构建之浅析

    jQuery的初始化与对象构建之浅析 jQuery是一个非常流行的JavaScript库,用于简化和加速JavaScript编程的过程。在使用jQuery之前,我们需要对其进行初始化,接着可以通过对象构建的方式来使用jQuery进行各种操作。下面将会具体介绍jQuery的初始化和对象构建的过程。 初始化 使用jQuery之前,我们需要进行初始化操作,即引入j…

    other 2023年6月20日
    00
  • linux下安装wireshark

    Linux下安装Wireshark Wireshark是一个功能强大的网络协议分析工具,在Linux下的安装过程相对简单。本文将提供一种在Debian/Ubuntu以及CentOS/RHEL系统下安装Wireshark的方法,希望对您有所帮助。 1. 在Debian/Ubuntu系统下安装Wireshark 在Debian和Ubuntu系统下,可以通过apt…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部