linux多线程编程 -- __thread

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux多线程编程 -- __thread相关的知识,希望对你有一定的参考价值。

参考技术A

__thread 是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。
__thread 变量 每一个线程有一份独立实体 ,各个线程的值互不干扰。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。

只能修饰 POD 类型(类似整型指针的标量,不带自定义的构造、拷贝、赋值、析构的类型,二进制内容可以任意复制memset,memcpy,且内容可以复原)
  不能修饰 class 类型,因为无法自动调用构造函数和析构函数,可以用于修饰全局变量,函数内的静态变量,不能修饰函数的局部变量或者class的普通成员变量,且__thread变量值只能初始化为编译期常量,即编译期间就能确定值。

场景说明:每个线程有一些需要保存的上下文信息,即可使用 __thread 变量

linux学习(35):多线程读取文件

多线程读取文件:

# _*_coding:utf-8_*_
import time, threading, ConfigParser

‘‘‘
Reader类,继承threading.Thread
@__init__方法初始化
@run方法实现了读文件的操作
‘‘‘
class Reader(threading.Thread):
    def __init__(self, file_name, start_pos, end_pos):
        super(Reader, self).__init__()
        self.file_name = file_name
        self.start_pos = start_pos
        self.end_pos = end_pos

    def run(self):
        fd = open(self.file_name, r)
        ‘‘‘
        该if块主要判断分块后的文件块的首位置是不是行首,
        是行首的话,不做处理
        否则,将文件块的首位置定位到下一行的行首
        ‘‘‘
        if self.start_pos != 0:
            fd.seek(self.start_pos-1)
            if fd.read(1) != \n:
                line = fd.readline()
                self.start_pos = fd.tell()
        fd.seek(self.start_pos)
        ‘‘‘
        对该文件块进行处理
        ‘‘‘
        while (self.start_pos <= self.end_pos):
            line = fd.readline()
            ‘‘‘
            do somthing
            ‘‘‘
            self.start_pos = fd.tell()

‘‘‘
对文件进行分块,文件块的数量和线程数量一致
‘‘‘
class Partition(object):
    def __init__(self, file_name, thread_num):
        self.file_name = file_name
        self.block_num = thread_num

    def part(self):
        fd = open(self.file_name, r)
        fd.seek(0, 2)
        pos_list = []
        file_size = fd.tell()
        block_size = file_size/self.block_num
        start_pos = 0
        for i in range(self.block_num):
            if i == self.block_num-1:
                end_pos = file_size-1
                pos_list.append((start_pos, end_pos))
                break
            end_pos = start_pos+block_size-1
            if end_pos >= file_size:
                end_pos = file_size-1
            if start_pos >= file_size:
                break
            pos_list.append((start_pos, end_pos))
            start_pos = end_pos+1
        fd.close()
        return pos_list

if __name__ == __main__:
    ‘‘‘
    读取配置文件
    ‘‘‘
    config = ConfigParser.ConfigParser()
    config.readfp(open(conf.ini))
    #文件名
    file_name = config.get(info, fileName)
    #线程数量
    thread_num = int(config.get(info, threadNum))
    #起始时间
    start_time = time.clock()
    p = Partition(file_name, thread_num)
    t = []
    pos = p.part()
    #生成线程
    for i in range(thread_num):
        t.append(Reader(file_name, *pos[i]))
    #开启线程
    for i in range(thread_num):
        t[i].start()
    for i in range(thread_num):
        t[i].join()
    #结束时间
    end_time = time.clock()
    print "Cost time is %f" % (end_time - start_time)

 

以上是关于linux多线程编程 -- __thread的主要内容,如果未能解决你的问题,请参考以下文章

单线程和多线程执行对比—Python多线程编程

linux学习(35):多线程读取文件

并发编程之线程多线程

python并发编程之多线程

python并发编程:多线程-开启线程的两种方式

python核心编程笔记4--多线程