文档章节

多线程之 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
Linux环境编程--多线程

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

晨曦之光
2012/03/09
112
0
使用printf这样标准输入输出函数的线程,是否必须使用线程特定数据来确保线程安全?

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

怪蜀黍
2012/11/12
2.8K
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
33分钟前
1
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
0
0
890. Find and Replace Pattern - LeetCode

Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"abc ......

yysue
昨天
0
0
Linux | Redis

写在前面的话 常言道,不作笔记不读书。在下是深有体会啊,所以,跟我一起做下本节的笔记吧,或许多年以后,你一定会感谢今天的你。 安装 在官网的下载页 Redis Download 直接写了在Linux的安...

冯文议
昨天
1
0
NoSQL-memcached

NoSQL介绍 NoSQL叫非关系型数据库。而关系型数据库代表有MySQL。对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很...

ln97
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部