目录
创建线程
pthread_create
终止线程
pthread_exit
return 自动返回
等待线程
pthread_join
pthread_create
参数:
thread:返回线程ID
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:是个返回值和参数都为void*的函数的地址,线程启动后要执行的函数
arg:传给线程启动函数的参数返回值:成功返回0;失败返回对应的错误码
如果一个进程中的线程掉执行时发生错误异常导致线程终止退出,比如解引用空指针、除0错误都会时线程异常终止,这会导致整个进程也随之终止!
如果需要只终止某个线程而不终止整个进程,可以有三种方法:1. 从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit。2. 线程可以调用pthread_ exit终止自己。 3. 一个线程可以调用pthread_ cancel终止同一进程中的另一个线程。pthread_exit
参数:
注意:pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。
线程等待和进程等待的目的基本是一样的!目的是:1.释放已经终止的线程的空间。2.得到线程的执行任务的情况即线程启动函数的返回值(一般通过该值判断线程执行任务的情况)。
pthread_join
参数:
retval:指向一个指针,即线程启动函数的返回值。
返回值:
成功返回0;失败返回对应的错误码
注意:使用pthread_join是阻塞等待线程。
在Linux中,这些控制线程的函数都在libpthread.so动态库中,因此链接这些线程函数库时要使用编译器命令的“-lpthread”选项。
代码如下:
#include #include #include class Request { public: Request(const char *str, int _cnt = 0) : s(str), cnt(_cnt) { } std::string Transform(int num) { std::string str = s + "-"; ++cnt; return str + std::to_string(num); } public: std::string s; int cnt; }; class Response { public: Response(int _cnt = 0) : cnt(_cnt) { } public: int cnt; }; void *Routine(void *arg) { Response *prs = new Response; Request rq(static_cast(arg)); std::cout << "合并线程名称:" << rq.Transform(1); if (rq.cnt > 0) prs->cnt++; return (void *)prs; } int main() { pthread_t tid; // 新线程的用户级ID void *retval; pthread_create(&tid, nullptr, Routine, (void *)"thread"); pthread_join(tid, &retval); // 等待新线程并且获取线程启动函数的返回值 Response *ret = static_cast(retval); if (ret->cnt > 0) // 根据新线程启动函数返回值判断该线程的任务完成情况 { std::cout << "thread-1执行任务成功!" << std::endl; } delete ret; return 0; }