linux下pthread基本操作

2021-08-19 14:04:14 字數 3681 閱讀 3230

#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

[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]#

中間有遇到乙個小問題,用gcc編譯cpp檔案,有下面錯誤:

[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_test

pthread_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...