如何讓errno多執行緒 程序安

2022-02-27 04:07:26 字數 1002 閱讀 6603

在linux或者unix環境中,errno是乙個十分重要的部分。在呼叫的函式出現問題的時候,我們可以通過errno的值來確定出錯的原因,這就會 涉及到乙個問題,那就是如何保證errno在多執行緒或者程序中安全?我們希望在多執行緒或者程序中,每個執行緒或者程序都擁有自己獨立和唯一的乙個 errno,這樣就能夠保證不會有競爭條件的出現。一般而言,編譯器會自動保證errno的安全性,但是為了妥善期間,我們希望在寫makefile的時 候把_libc_reentrant巨集定義,比如我們在檢查檔案中發現如下的定義:

# ifndef __assembler__

/* function to get address of global `errno' variable.  */

extern int *__errno_location (void) __throw __attribute__ ((__const__));

#  if !defined _libc || defined _libc_reentrant

/* when using threads, errno is a per-thread value.  */

#   define errno (*__errno_location ())

#  endif

# endif /* !__assembler__ */

#endif /* _errno_h */

也就是說,在沒有定義__libc或者定義_libc_reentrant的時候,errno是多執行緒/程序安全的。

一般而言, __assembler__, _libc和_libc_reentrant都不會被編譯器定義,但是如果我們定義_libc_reentrant一次又何妨那?

為了檢測一下你編譯器是否定義上述變數,不妨使用下面乙個簡單程式。

#include

#include

int main( void )

希望讀者在進行移植的時候,讀一下相關的unix版本的檔案,來確定應該定義什麼巨集。不同的unix版本可能存在著一些小的差別!

程序 執行緒 多執行緒

程序是系統中正在執行的乙個程式,程式一旦執行就是程序。程序可以看成程式執行的乙個例項。程序是系統資源分配的獨立實體,每個程序都擁有獨立的位址空間。乙個程序無法訪問另乙個程序的變數和資料結構,如果想讓乙個程序訪問另乙個程序的資源,需要使用程序間通訊,比如管道,檔案,套接字等。乙個程序可以擁有多個執行緒...

安卓 多執行緒

方法1 建立單獨的執行緒 new thread new runnable start 方法2 利用執行緒池 private executorservice executorservice executors.newfixedthreadpool 4 上面是建立乙個固定大小的執行緒池,這裡面的執行緒不...

安卓 多執行緒

第一種實現子執行緒的方法 繼承thread類 private class mythread extends thread new mythread start 第二種實現子執行緒的方式 實現runnable 任務 介面 private class myrunnable implements runn...