Linux下的多线程编程(三)

Linux下的多线程编程(三)完整攻略

1. pthread_join函数

pthread_join函数主要用于等待一个线程结束,并获取它的退出状态。函数的原型为:

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

其中,第一个参数thread是要等待的线程ID,如果值为零,则等待任何一个线程。第二个参数retval是用来存储线程退出状态的,它是一个指向指针的指针类型,如果不关心线程退出状态,可以将此参数设为NULL。

函数返回值为0表示成功,非0表示失败。

下面的示例展示了如何使用pthread_join函数。

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

void *thread_func(void *arg)
{
    int val = *((int*)arg);
    printf("thread_func: arg=%d\n", val);
    pthread_exit((void*)val);
}

int main()
{
    pthread_t thread;
    int arg = 123;
    void *retval;
    pthread_create(&thread, NULL, thread_func, &arg);
    pthread_join(thread, &retval);
    printf("main: thread exited with %d\n", (int)retval);
    return 0;
}

在上面的示例中,我们创建了一个线程并传递了一个整数值作为参数。线程执行函数将会获取这个参数并打印。主线程使用pthread_join函数等待线程结束并获取线程退出状态,然后打印出来。

2. 线程的局部数据

除了线程共享的全局数据和堆内存,线程还可以拥有自己的局部数据。这些数据只能被拥有它的线程访问和修改。每个线程的局部数据独立于其他线程的局部数据,也就是说,它们不共享内存。

线程的局部数据通过pthread_key_create、pthread_key_delete和pthread_getspecific、pthread_setspecific等函数来进行操作。

下面的示例展示了如何使用pthread_key_create、pthread_key_delete和pthread_setspecific函数来创建、销毁、设置和获取线程的局部数据。

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

pthread_key_t key;

void dest(void *value)
{
    printf("dest: value=%p\n", value);
    free(value);
}

void *thread_func(void *args)
{
    int *value = malloc(sizeof(int));
    *value = *((int*)args);
    pthread_setspecific(key, value);
    printf("thread_func: value=%p\n", value);
    return NULL;
}

int main()
{
    pthread_t thread1, thread2;
    int arg1 = 123, arg2 = 456;

    pthread_key_create(&key, dest);
    pthread_create(&thread1, NULL, thread_func, &arg1);
    pthread_create(&thread2, NULL, thread_func, &arg2);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    pthread_key_delete(key);
    return 0;
}

在上面的示例中,我们使用pthread_key_create函数创建了一个线程局部数据key,使用pthread_setspecific函数设置了key的值。线程执行函数中的局部变量value分别被设置了不同的值,并打印。在主线程中,我们调用pthread_join等待两个线程结束后,使用pthread_key_delete函数销毁key。注意:在销毁线程局部数据之前,必须确保所有拥有它的线程已经退出。这是因为在线程结束后,key会自动被系统销毁。

结语

本文介绍了pthread_join函数和线程的局部数据,并通过示例说明了它们的使用方法。掌握了这些技术,我们在实际开发中能更好的利用Linux多线程编程的优势,提高程序性能和稳定性。

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

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

相关文章

  • java并发编程工具类JUC之LinkedBlockingQueue链表队列

    Java并发编程工具类JUC中,LinkedBlockingQueue是一种基于链表的阻塞队列。它可以支持多线程并发访问,是用于多线程交换数据的缓冲区。下面详细讲解一下该队列的使用方法。 LinkedBlockingQueue的特点和操作方法 特点 LinkedBlockingQueue内部采用了一种“等待-通知”机制,当试图向队列中添加元素时,如果队列已满…

    多线程 2023年5月17日
    00
  • node 使用 async 控制并发的方法

    一、什么是 Node.js? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 采用了事件驱动、非阻塞 I/O(input/output)模型,使其轻量又高效。 二、为什么使用 async 控制并发? 在编写 Node.js 程序时,往往需要同时进行多个操作,比如同时读取多个文件、同时请求多个接口等等。如…

    多线程 2023年5月16日
    00
  • Java多线程的调度_动力节点Java学院整理

    Java多线程的调度_动力节点Java学院整理 概述 Java中的多线程是通过Thread类来实现的,一个线程即是Java中的一个Thread对象。多个线程可以同时执行,这种方式称为多线程并发执行。在多个线程并发执行时,操作系统会给每个线程分配一个时间片用于执行。由于时间片非常短,一般是几毫秒,因此看起来多个线程是同时执行的。 多线程的调度 在多线程并发执行…

    多线程 2023年5月17日
    00
  • java多线程之wait(),notify(),notifyAll()的详解分析

    Java多线程之wait(), notify(), notifyAll()的详解分析 在Java多线程编程中,wait(), notify(), notifyAll()是非常重要的方法。这三个方法都是用于线程间的协作,可以让线程在合适的时候等待或唤醒其他线程,实现高效的资源共享和数据交换。本文将详细介绍wait(), notify(), notifyAll(…

    多线程 2023年5月16日
    00
  • 聊聊SpringBoot的@Scheduled的并发问题

    下面是详细讲解SpringBoot的@Scheduled的并发问题的完整攻略。 什么是@Scheduled @Scheduled是Spring框架中用于定时任务的注解。使用该注解可以实现在指定的时间间隔或特定时间执行代码块。 @Schedule的并发问题 在使用@Scheduled注解时,可能会出现并发的问题。在Spring Boot 2.x版本中,@Sch…

    多线程 2023年5月17日
    00
  • Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题

    让我来详细讲解一下“Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题”的攻略。 1. 背景 在高并发场景下,MySQL 插入数据的效率会变慢,可能会影响接口性能。而且,频繁插入数据也会使数据库压力加大。为了解决这个问题,我们可以使用 Redis 缓存,将数据先缓存到 Redis 中,再批量写入到 MySQL 数据库中…

    多线程 2023年5月17日
    00
  • Java 高并发一:前言

    下面是Java 高并发一:前言章节的完整攻略。 前言 本章节的主要内容是介绍Java高并发的相关知识,包括并发编程的基础概念、并发编程中的共享资源问题以及Java并发编程的基础框架等。同时,本章节还通过具体的案例分析来帮助读者更好地理解Java高并发的相关知识。 基础概念 并发编程中的基础概念主要包括线程、进程、并发、并行等。其中,线程是并发编程的基本单位,…

    多线程 2023年5月16日
    00
  • Java实现多线程的上下文切换

    Java的多线程机制是一种高级的并发编程技术,允许我们使用多个线程并行执行单个程序,从而提高程序的并发性能。多线程的核心是上下文切换,指的是在进程中将 CPU 的控制权从一个正在运行的线程转移到另一个正在等待运行的线程。下面将详细讲解Java实现多线程的上下文切换的完整攻略。 创建线程 Java实现多线程的第一步是创建线程。Java中有两种方式实现创建线程:…

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