2012-12-28 41 views
0
  • 嗨,我使用C庫來編程機器人。在閱讀 的代碼時,我遇到了「_ 線程」這個詞,我不知道它的意思是什麼 。我試圖通過該項目進行搜索以查看 是否有「 _thread」的任何定義,但對我來說它沒有意義 。下面的代碼我猜可能與我的問題有關。

我的問題是,從「static __thread Thread * threadData;」行和「__thread AssertFramework ::主題* AssertFramework :: threadData = 0;」?,你能猜出「__thread「的意思是一類特殊的函數名的指針線程???在Ubuntu上「__thread」

#include <sys/mman.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <pthread.h> 
#include <cstring> 
... 
class AssertFramework 
{ 
public: 
    struct Line 
    { 
    char file[128]; 
    int line; 
    char message[128]; 
    }; 

    struct Track 
    { 
    Line line[16]; 
    int currentLine; 
    bool active; 
    }; 

    struct Thread 
    { 
    char name[32]; 
    Track track[2]; 
    }; 

    struct Data 
    { 
    Thread thread[2]; 
    int currentThread; 
    }; 

    static pthread_mutex_t mutex; 
    static __thread Thread* threadData; 

    int fd; 
    Data* data; 

    AssertFramework() : fd(-1), data((Data*)MAP_FAILED) {} 

    ~AssertFramework() 
    { 
    if(data != MAP_FAILED) 
     munmap(data, sizeof(Data)); 
    if(fd != -1) 
     close(fd); 
    } 

    bool init(bool reset) 
    { 
    if(data != MAP_FAILED) 
     return true; 

    fd = shm_open("/bhuman_assert", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); 
    if(fd == -1) 
     return false; 

    if(ftruncate(fd, sizeof(Data)) == -1 || 
     (data = (Data*)mmap(NULL, sizeof(Data), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) 
    { 
     close(fd); 
     fd = -1; 
     return false; 
    } 

    if(reset) 
     memset(data, 0, sizeof(Data)); 

    return true; 
    } 

} assertFramework; 

pthread_mutex_t AssertFramework::mutex = PTHREAD_MUTEX_INITIALIZER; 
__thread AssertFramework::Thread* AssertFramework::threadData = 0; 
? 。
+0

可能是一個編譯器的具體實現[線程本地存儲(HTTP的:// en.wikipedia.org/wiki/Thread-local_storage) –

+0

這是一個存儲類,像'static'或'extern'。 –

回答

1

這是GCC的特殊Thread-Local Storage需要注意的是C11增加了_Thread_local和C++ 11增加thread_local以支持線程本地數據的標準方法

+0

是啊!那完全是答案。謝謝:) –