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

yizhihongxing

详解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日

相关文章

  • 聊聊Java 成员变量赋值和构造方法谁先执行的问题

    聊聊Java 成员变量赋值和构造方法谁先执行的问题 在Java中,成员变量赋值和构造方法的执行顺序是有一定规律的。了解这个问题对于理解对象的创建和初始化过程非常重要。下面是详细的攻略: 1. 成员变量赋值 在Java中,成员变量可以在声明时进行初始化,也可以在构造方法中进行赋值。当成员变量在声明时进行初始化时,它们会在构造方法执行之前被赋值。如果成员变量没有…

    other 2023年8月6日
    00
  • 详解Android中Fragment的两种创建方式

    一、Fragment的概述 Fragment是Android中的一种UI组件,可以被称为“Activity的子Activity”,因为一个Activity可以有多个Fragment,Fragment可以嵌套在Activity的布局中,且可以动态加载、替换、添加、删除等操作。 二、Fragment的创建方式 在Android中,Fragment有两种创建方式:…

    other 2023年6月27日
    00
  • ZooKeeper入门教程一简介与核心概念

    ZooKeeper入门教程一:简介与核心概念 简介 ZooKeeper是一个分布式的解决方案,它可以用来管理和协调分布式应用程序。ZooKeeper可以用于实现诸如分布式锁、服务发现和集群管理等功能。ZooKeeper的设计目标是提供一个高性能、高可靠性、具备严格顺序性、支持分布式部署的专用协调服务。 核心概念 ZNode ZNode是ZooKeeper的数…

    other 2023年6月27日
    00
  • iOS9正式版固件下载地址大全 iOS9正式版升级教程

    iOS9正式版固件下载地址大全 iOS9是苹果公司推出的操作系统的最新版本。本攻略将为您提供iOS9正式版固件下载地址大全以及升级教程。 步骤一:备份数据 在升级之前,建议您先备份您的设备上的所有数据。这样可以确保您的数据在升级过程中不会丢失。您可以通过iTunes或iCloud进行备份。 步骤二:选择合适的固件下载地址 在升级之前,您需要下载适用于您的设备…

    other 2023年8月4日
    00
  • 详解Android中的NestedScrolling机制带你玩转嵌套滑动

    详解Android中的NestedScrolling机制带你玩转嵌套滑动 什么是NestedScrolling机制? NestedScrolling机制是Android中用于处理嵌套滑动的一种机制。在传统的滑动机制中,只能由父容器来处理滑动事件,而NestedScrolling机制允许子View也能够处理滑动事件,并将剩余的滑动事件传递给父容器处理。 如何使…

    other 2023年7月27日
    00
  • webstorm10配置

    WebStorm 10 配置 WebStorm 10 是一个非常专业好用的 JavaScript 开发工具,在开发 JavaScript 项目时非常有用。WebStorm 10 具有许多强大的功能和工具,但在使用之前,我们需要对其进行配置。 安装 WebStorm 10 WebStorm 10 可以从官方网站 http://www.jetbrains.com…

    其他 2023年3月28日
    00
  • 关于c#:无法添加对.dll的引用。请确保该文件可访问 并且…

    关于C#:无法添加对.dll的引用攻略 在C#中,我们可以使用引用来使用其他程序集中的类和方法。有时,我们可能会遇到无法添加对.dll的引用的问题。本攻略将介绍这个问题的原因,并提供两个示例。 原因 无法添加对.dll的引用的原因可能有多。以下是一些常见的原因: 文件不可访问:.dll文件可能被其他进程锁定,或者我们没有足够的权限来访问文件。 文件已损坏:.…

    other 2023年5月9日
    00
  • Win8下Android SDK安装与环境变量配置教程

    下面就为你介绍Win8下Android SDK的安装与环境变量配置教程,具体步骤如下: 1. 下载Android SDK 首先,你需要下载最新版本的Android SDK。可以在Google官网上获取。 2. 安装Android SDK 下载之后,解压到你想要安装的位置,比如D:\Android_SDK。然后打开SDK Manager.exe,选择你需要安装…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部