#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define true 1
#define false 0
static
void *_thread1(void* arg)
//列印執行緒建立時的輸入的字串;
printf("the thread id is:0x%x, inputstr:%s\n", threadid, ((string*)arg)->c_str());
sleep(1);
count++;
}
return (void*)&count;
}static
void _threadattrset(pthread_attr_t *attr, unsigned priority, bool bdetached)
int main(int argc, char *argv)
//等待執行緒id為thread1id的非分離執行緒退出,並獲取執行緒的返回值thread1ret;
//該函式成功應該返回0;如果返回 edeadlk,表示執行緒內部右死鎖;返回einval,則執行緒是分離執行緒,
//分離執行緒不用呼叫pthread_join,系統會自動**執行緒資源;返回einval,重複呼叫pthread_join等待
//同一執行緒退出;返回esrch,則執行緒id是非法的;
int ret = pthread_join(thread1id, &thread1ret);
if(0 != ret)
else
//顯式銷毀執行緒建立引數thread1attr,必須要重新做pthread_attr_init才能使用該引數;
pthread_attr_destroy(&thread1attr);
while(1)
return
0;}
上面demo需要在root許可權下編譯執行,如下:
[root@localhost linux_env]# g++ pthread_test.cpp -o pthread_test -lpthread中間有遇到乙個小問題,用gcc編譯cpp檔案,有下面錯誤:[root@localhost linux_env]# ./pthread_test
the thread id is:0x2264c700, inputstr:my name is zoobi!
the thread id is:0x2264c700, inputstr:my name is zoobi!
the thread id is:0x2264c700, inputstr:my name is zoobi!
the thread id is:0x2264c700, inputstr:my name is zoobi!
the thread id is:0x2264c700, inputstr:my name is zoobi!
exit :_thread1
the task return value is:5
main thread !
^c [root@localhost linux_env]#
[zoobi@localhost linux_env]$ gcc pthread_test.cpp -o pthread_test -lpthread
/tmp/ccktcqrf.o:在函式『_thread1(void*)』中:
pthread_test.cpp:(.text+0x46):對『std:
:__cxx11
::basic_string, std:
:char_traits, std:
:allocator >:
:c_str() const』未定義的引用
/tmp/ccktcqrf.o:在函式『main』中:
pthread_test.cpp:(.text+0x135):對『__cxa_guard_acquire』未定義的引用
pthread_test.cpp:(.text+0x14f):對『std:
:allocator
::allocator()』未定義的引用
pthread_test.cpp:(.text+0x165):對『std:
:__cxx11
::basic_string, std:
:char_traits, std:
:allocator >:
:basic_string(char const*, std:
:allocator const&)』未定義的引用
pthread_test.cpp:(.text+0x16f):對『__cxa_guard_release』未定義的引用
pthread_test.cpp:(.text+0x17e):對『std:
:__cxx11
::basic_string, std:
:char_traits, std:
:allocator >:
:~basic_string()』未定義的引用
pthread_test.cpp:(.text+0x18f):對『std:
:allocator
::~allocator()』未定義的引用
pthread_test.cpp:(.text+0x26a):對『std:
:allocator
::~allocator()』未定義的引用
pthread_test.cpp:(.text+0x278):對『__cxa_guard_abort』未定義的引用
/tmp/ccktcqrf.o:在函式『__static_initialization_and_destruction_0(int, int)』中:
pthread_test.cpp:(.text+0x2b3):對『std:
:ios_base
::init::init()』未定義的引用
pthread_test.cpp:(.text+0x2c2):對『std:
:ios_base
::init::~init()』未定義的引用
/tmp/ccktcqrf.o:(.eh_frame+0x67):對『__gxx_personality_v0』未定義的引用
collect2: 錯誤:ld 返回 1
原因是gcc預設編譯鏈結是不會鏈結c++標準庫的,可用使用g++編譯鏈結,當然也可以使用gcc鏈結時顯式指定鏈結-lstdc++:
gcc pthread_test.cpp -o pthread_test -lpthread -lstdc++上面demo改到普通使用者下執行,由於有呼叫pthread_attr_setinheritsched,所以導致建立執行緒失敗,如下:
[zoobi@localhost linux_env]./pthread_testpthread_create failed!
[zoobi@localhost linux_env]$
linux下pthread的編譯
今天在linux下寫乙個多執行緒程式時,在.c 檔案中包含了標頭檔案 pthread.h 但是編譯時卻報錯 對 pthread create 未定義的引用 上網查了下,原來pthread庫不是linux預設的庫,所以在編譯時要手動鏈結,做法如下 gcc mian.c lpthread find pa...
pthread基本操作
int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg return value on success,pthread create returns 0 on err...
linux下pthread的編譯詳解
今天在linux下寫乙個多執行緒程式時,在.c 檔案中包含了標頭檔案 pthread.h 但是編譯時卻報錯 對 pthread create 未定義的引用 gcc mian.c lpthread 由於我是在clion下寫的 所以要想讓clion支援自動鏈結pthread庫,需要在專案的cmakeli...