文档章节

多线程之 pthread_key_*

老汉-憨憨
 老汉-憨憨
发布于 2017/07/24 15:52
字数 204
阅读 11
收藏 0
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_PTHREAD (5)

pthread_key_t log_key;

void write_log(const char *msg)
{
    if (!msg) {
        return;
    }

    FILE *logFile = (FILE *)pthread_getspecific(log_key);
    if (logFile) {
        fprintf(logFile, "Thread :%ld, msg = %s\n", pthread_self(), msg);
    }
}

void close_file(void *logFile)
{
    if (logFile) {
        fclose((FILE *)logFile);
        logFile = NULL;
    }
}

void *threadStart(void *args)
{
    char filename[1024] = {'\0'};
    FILE *logFile = NULL;
    snprintf(filename, sizeof(filename) - 1, "thread_%ld.log", (long)pthread_self());
    logFile = fopen(filename, "w");
    if (!logFile) {
        pthread_exit(NULL);
    }
    pthread_setspecific(log_key, (void *)logFile);

    write_log("test pthread key!");
}

int main(int argc, char *argv[])
{
    int i;
    pthread_key_create(&log_key, close_file);

    pthread_t thread[MAX_PTHREAD];
    for (i = 0; i < MAX_PTHREAD; i++) {
        pthread_create(&thread[i], NULL, threadStart, NULL);
    }

    for (i = 0; i < MAX_PTHREAD; i++) {
        pthread_join(thread[i], NULL);
    }

    return 0;
}

编译输出:

cc key2.c -o key2 -lpthread

#运行生成 5 个文件
thread_1095313728.log  thread_1117501760.log  thread_1083889984.log  thread_1109109056.log  thread_1125894464.log
后面的数字为线程ID

cat thread_1083889984.log 
Thread :1083889984, msg = test pthread key!

cat thread_1095313728.log 
Thread :1095313728, msg = test pthread key!

 

© 著作权归作者所有

共有 人打赏支持
老汉-憨憨
粉丝 18
博文 322
码字总数 68382
作品 0
深圳
程序员
Linux多线程Pthread学习小结

简介 POSIX thread 简称为pthread,Posix线程是一个POSIX标准线程.该标准定义内部API创建和操纵线程. 作用 线程库实行了POSIX线程标准通常称为pthreads.pthreads是最常用的POSIX系统如Linux...

长平狐
2013/01/06
40
0
Linux多线程Pthread学习小结

简介 POSIX thread 简称为pthread,Posix线程是一个POSIX标准线程.该标准定义内部API创建和操纵线程. 作用 线程库实行了POSIX线程标准通常称为pthreads.pthreads是最常用的POSIX系统如Linux...

晨曦之光
2012/03/02
144
0
Linux中的线程局部存储(一)

在 Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对 程序的性能带来了很大的影响,当然对于那些...

follitude
2016/06/17
16
0
使用printf这样标准输入输出函数的线程,是否必须使用线程特定数据来确保线程安全?

Linux 下C语言写的多线程程序中: 有介绍说:标准输入输出函数 是非线程安全的。 那是不是就是说,只要我在多线程程序中,使用了标准输入输出函数,就要使用像线程特定数据这样的手段,确保线...

怪蜀黍
2012/11/12
2.8K
4
Linux环境编程--多线程

本文作者: 姚继锋 (2001-08-11 09:05:00) 时隔多年 原文地址已经无从查。。。 居然是2001年就写了 今天看来对初学者还是很有参考意义 所以特转给大家 本人在原文基础上适当修改 1 引言 线程(...

晨曦之光
2012/03/09
112
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式块存储的引擎如何设计?

前言: 目前在万兆网络和SSD,包括NVMe SSD 都已经非常普及。随着硬件的速度越来越快,性能的瓶颈会从硬件转移到软件。尤其对于存储引擎来说,性能至关重要。 先来看一下我们会对数据存储引擎...

Java干货分享
11分钟前
0
0
docker(五):docker-compose.yml 配置

docker-compose.yml常用命令 image 指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。 示例: image: java build 指定Dockerfile文件的路径。可以是一个路径,例如...

开心的哈士奇
15分钟前
0
0
Tale的升级真是惊心动魄,吓死人

精心动魄的博客升级计划,Tale 这几天在筹划将分散在其他几个地方的博客统一到这里来,也就留意了tale的更新,发现出现了2.0.1版本; 因此动了升级的念头,唉! 高估了个人开放着的系统规划能...

硅步积千里
25分钟前
0
0
tcc分布式事物

因为最近公司的新退货系统用到了spring cloud。所以会涉及到一些分布式事物。 所以需要先了解一下,分布式事物。 shuaiqiyu / hmily 高性能异步分布式事务TCC框架 谭纳 / spring-cloud-rest-...

miaojiangmin
26分钟前
0
0
20181016 上课截图

小丑鱼00
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部