線程編程 pthread 問題集合

1  undefined reference to `pthread_create'
因爲pthread 庫不是 Linux 系統默認的庫,鏈接時須要使用靜態庫 libpthread.a,因此在使用pthread_create()建立線程,以及調用 pthread_atfork()函數創建fork處理程序時,在編譯中要加 -lpthread參數php

例如:在加了頭文件#include <pthread.h>以後執行 pthread.c文件,須要使用以下命令:    gcc thread.c -o thread -lpthreadhtml

這種狀況相似於<math.h>的使用,需在編譯時加 -m 參數。


linux

pthread_create()和pthread_atfork()函數使用時應注意的問題:安全

#include <pthread.h>

void pmsg(void* p)
{
    char *msg;
    msg = (char*)p;
    printf("%s ", msg);
}

int main(int argc, char *argv)
{
    pthread_t t1, t2;
    pthread_attr_t a1, a2;
    char *msg1 = "Hello";
    char *msg2 = "World";

    pthread_attr_init(&a1);
    pthread_attr_init(&a2);
    pthread_create(&t1, &a1, (void*)&pmsg, (void*)msg1);
    pthread_create(&t2, &a2, (void*)&pmsg, (void*)msg2);

    return 0;
}

gcc thread.c
/tmp/ccFCkO8u.o: In function `main':
/tmp/ccFCkO8u.o(.text+0x6a): undefined reference to `pthread_create'
/tmp/ccFCkO8u.o(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status


2  strerror問題
頭文件  
#include <error.h>多線程

該文件定義了errno (即error number)對應的數值得含義.函數

在單線程程序中, errno在error.h中定義爲一個全局變量 int. 在多線程程序中, 只要有_REENTRANT宏, errno被擴展爲一個函數, 每一個線程都有本身局部存儲的errno. 總之, 在Linux中errno是線程安全的, 每一個線程都有本身的錯誤碼,放心使用.
測試

strerror(errno) 顧名思義, 就是把錯誤碼轉換爲有意義的字符串.  spa

perror("your message") 在打印完你本身的錯誤信息your message後, 會把錯誤碼對應的字符串信息也打印出來, 即:printf("your message"), then strerror(errno)  因此, perro最好使, 很好,很強大~~


線程

#include <stdio.h>   // void perror(const char *msg);
#include <string.h>  // char *strerror(int errnum);
#include <errno.h>  //errno
orm


errno 是錯誤代碼,在 errno.h頭文件中;
perror是錯誤輸出函數,輸出格式爲:msg:errno對應的錯誤信息(加上一個換行符);
strerror 是經過參數 errnum (就是errno),返回對應的錯誤信息。

如下是測試程序:

--------------------------------------------------------------------

// p_str_error.c
// perror , strerror 函數 , errno 測試

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
 FILE *fp;
 char *buf;

 if( (fp = fopen(argv[1], "r")) == NULL)
 {
  perror("perror"); // 好方便
  errno = 12;
  printf("strerror: %s\n", strerror(errno)); //轉換錯誤碼爲對應的錯誤信息
  exit(1);
 }
 perror("perror");
 errno = 13;
 printf("strerror: %s\n", strerror(errno));
 
 fclose(fp); 
 return 0;
}


輸入一個存在的文件名,如:./a.out 111

open失敗則會輸出:
perror: No such file or directory
strerror: Cannot allocate memory

open成功則會輸出:
perror: Success
strerror: Permission denied

很明顯,perror信息是由 perror函數輸出的了,第二行是 strerror經過將 errno 輪換成對應的錯誤信息打印出來。

相關文章
相關標籤/搜索