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日

相关文章

  • PHP多线程类及用法实例

    PHP多线程类及用法实例 什么是多线程? 多线程是指程序中有多个线程在同时执行,让程序可以同时完成多项任务,从而提高程序的运行效率。 PHP 多线程类 PHP 本身并不支持多线程,但可以使用 pthread 扩展来实现多线程。Pthread 是一个开源的多线程库,用于确保跨平台性能。 以下是 PHP 多线程的一个例子: <?php class MyTh…

    多线程 2023年5月17日
    00
  • Python高并发和多线程有什么关系

    Python高并发和多线程是密不可分的概念,下面我将详细讲解它们的关系。 一、概念解释 高并发 高并发指在同一时间内有大量的请求需要处理,需要系统具备快速的响应速度和稳定的性能。在Python中,常用的高并发处理方式有异步编程和多线程处理。 多线程 多线程指在同一时间内有多个线程在执行不同的任务。多线程使得任务可以并发执行,提高了系统的处理能力。 二、多线程…

    多线程 2023年5月16日
    00
  • 使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)

    使用pthreads扩展可以在PHP中实现真正的多线程执行,从而可以提高PHP代码的并发性和性能。下面是使用pthreads实现PHP多线程的完整攻略: 安装pthreads扩展:在PHP 5.3以上版本中,pthreads扩展已经被内置,但默认是未启用状态,需要在编译安装PHP时增加启用选项,或在运行时使用dl()函数来动态加载扩展。如果使用的是PHP 7…

    多线程 2023年5月17日
    00
  • mysql的MVCC多版本并发控制的实现

    MySQL实现了MVCC(多版本并发控制)机制,用于提高数据库的并发读写性能,与其他数据库中的锁定机制不同,MVCC使用数据库快照来实现并发控制,允许多个事务并发进行读写操作。 实现MVCC的关键是在每个记录中建立一个版本号,用于标识该记录的历史版本。在每个事务开始时,MySQL会创建一个事务视图,记录事务开始时的数据库快照,以及当前所有可见的历史版本。当一…

    多线程 2023年5月16日
    00
  • GC算法实现篇之并发标记清除

    GC算法实现篇之并发标记清除 简述 并发标记清除是一种适用于堆内存的垃圾回收算法,通常用于大型的应用程序或者需要长时间运行的应用程序中。其主要的特点是多线程标记和清除,相对于其他垃圾回收算法,具备了更好的性能表现。 基本流程 并发标记清除的基本流程如下: 初始状态:堆中的所有对象都被标记为“未标记” 初始标记:从根对象开始,对所有可达的对象进行标记。该过程是…

    多线程 2023年5月16日
    00
  • 解决线程并发redisson使用遇到的坑

    下面是“解决线程并发redisson使用遇到的坑”的完整攻略。 问题描述 在使用 Redisson 实现分布式锁时,遇到了线程并发问题。多个线程同时获取锁并执行业务逻辑,但是在释放锁之前,会有其他线程获取到锁,进而导致同一份数据被多个线程同时操作,最终导致了数据的不一致性。 解决方案 1. 针对锁失效问题 在 Redisson 中,锁可以设置失效时间和等待时…

    多线程 2023年5月16日
    00
  • 带你快速搞定java多线程(3)

    当我们需要处理一些比较消耗时间的操作时,多线程可以提高程序的执行效率,因此实现多线程在Java编程中也显得尤为重要。本文将带你从多方面快速搞定Java多线程,实现多任务并发执行。 1. 创建线程的三种方式 在Java中,创建线程的方式有三种:继承Thread类、实现Runnable接口以及使用线程池。 1.1 继承Thread类 继承Thread类是最简单的…

    多线程 2023年5月17日
    00
  • C#多线程基础知识汇总

    C#多线程基础知识汇总 什么是多线程? 多线程指在同一个程序中运行多个线程,每个线程独立运行,在不同线程中可以并发执行任务,从而提高程序运行效率。 多线程的优点和缺点 优点 提高程序运行效率; 更好地利用CPU资源。 缺点 多线程会增加程序的复杂性; 多线程的调试和维护比较困难; 多线程容易引起死锁和数据访问冲突等问题。 多线程的实现方式 继承Thread类…

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