文档章节

多线程之 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!

 

© 著作权归作者所有

共有 人打赏支持
上一篇: redis 之 adlist
老汉-憨憨
粉丝 19
博文 322
码字总数 68382
作品 0
深圳
程序员
私信 提问
Linux多线程Pthread学习小结

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

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

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

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

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

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

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

怪蜀黍
2012/11/12
3.2K
4
Linux多线程编程[精]

1 引言   线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中...

AlphaJay
2010/04/20
622
2

没有更多内容

加载失败,请刷新页面

加载更多

搭建git服务器————gitlab

github毕竟是公开的,而私有仓库又得花钱买。所以我们可以想办法搭建一个私有的,只自己公司使用的。Gitlab是个不错的选择。在介绍它之前,先讲述一下命令行的git服务器 找一台服务器,首先要...

chencheng-linux
6分钟前
1
0
用Redis实现“秒杀”系统

导论 曾经被问过好多次怎样实现秒杀系统的问题。昨天又在CSDN架构师微信群被问到了。因此这里把我设想的实现秒杀系统的价格设计分享出来。供大家参考。 秒杀系统的架构设计 秒杀系统,是典型...

小刀爱编程
20分钟前
7
0
GO redis 相关操作

在gopath 目录下安装 go get github.com/garyburd/redigo/redis package mainimport ("fmt""github.com/garyburd/redigo/redis")//定义一个全局链接池变量var pool *redis.Pool//......

汤汤圆圆
57分钟前
20
0
java8性特性,常用的lambda表达式

1、抽取多个对象中的某个属性,用数组接收 List<Student> students = new ArrayList<>(); List<String> names =students.stream().map(Student::getName).collect(Collectors.toList()); 2、......

Boss-x
58分钟前
19
0
flutter 子组件与父组件

无论是子组件还是父组件,任何时候initState()只执行一次,如果需要判断 就在build里面进行,不然无效的。

大灰狼wow
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部