一,创建线程
phread_create函数
功能:创建一个新的线程。
原型:
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
参数:
thread:输出型参数,输出线程的id;
attr:设置线程的属性,如果为空,则代表设置为默认属性;
statr_routine:线程创建后要执行的函数;
arg:线程要执行函数的参数;
返回值:
成功则返回0,失败则返回-1,并设置相关的错误码
二,线程终止
pthread_exit函数
功能:线程终止
原型:
void pthread_exit(void *value_ptr);
参数:
value_ptr:value_ptr不要指向一个局部变量,它指向的数据将作为线程退出时的返回值。如果线程不需要返回任何数据,将 retval 参数置为 NULL 即可。
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)
具体使用如下:
#include <pthread.h>
#include <iostream>
#include <unistd.h>
using namespace std;
int x=1;
void *fun(void *arg)
{
string s = (char *)arg;
pthread_exit((void*)&x);
while (true)
{
cout << s << endl;
sleep(1);
}
}
int main()
{
pthread_t thread;
char name[64];
snprintf(name, sizeof name, "%s", "我是从线程");
int n = pthread_create(&thread, nullptr, fun, (void *)name);
int* ret;
int m=pthread_join(thread,(void**)&ret);
cout<<*ret<<endl;
}
运行结果如下:
pthread_cancel函数
功能:
取消一个线程的执行(可以是其他线程使用该函数取消该线程,也可以是自己取消自己)
原型:
int pthread_cancel(pthread_t thread);
参数:
thread:线程的id号
返回值:
如果成功,pthread_cancel()返回0;当出现错误时,它返回一个非零的错误编号。
具体使用如下:
#include <pthread.h>
#include <iostream>
#include <unistd.h>
using namespace std;
int x=1;
void *fun(void *arg)
{
string s = (char *)arg;
//pthread_exit((void*)&x);
int i=0;
while (true)
{
cout << s << endl;
i++;
if(i==5) pthread_cancel(pthread_self()/*获取自身线程id*/);
sleep(1);
}
}
int main()
{
pthread_t thread;
char name[64];
snprintf(name, sizeof name, "%s", "我是从线程");
int n = pthread_create(&thread, nullptr, fun, (void *)name);
int* ret;
int m=pthread_join(thread,nullptr);
cout<<"从线程退出"<<endl;
while(true)
{
sleep(1);
}
return 0;
}
执行结果如下
三,等待线程
pthread_join函数
功能:等待从线程终止或停止运行,并且接受从进程返回的相关数据
原型:
int pthread_join(pthread_t thread,void**
value_ptr
);
参数:
thread:要等待的从线程的id号
value_ptr:输出型参数,接受从线程的返回值,如果设置为空则代表忽略从进程的返回值
返回值:
如果成功,pthread_join()返回0;当出现错误时,它返回一个错误编号
四,分离线程
pthread_detach函数
功能:分离一个线程(当一个线程被分离,这是主线程就不会再关注这个被分离的从线程,在从线程执行完毕时,将自动释放自身资源,这时如果在使用pthread_join函数对该线程进行等待将会出现错误)
原型:
int pthread_detach(pthread_t thread);
参数:
thread:要分离的从线程id;
返回值:如果成功,pthread_detach()返回0;当出现错误时,它返回一个错误编号。
具体操作如下
#include <pthread.h>
#include <iostream>
#include <unistd.h>
using namespace std;
int x=1;
void *fun(void *arg)
{
pthread_detach(pthread_self());
string s = (char *)arg;
//pthread_exit((void*)&x);
int i=0;
while (true)
{
cout << s << endl;
i++;
if(i==5) break;//pthread_cancel(pthread_self()/*获取自身线程id*/);
sleep(1);
}
return (void*)&x;
}
int main()
{
pthread_t thread;
char name[64];
snprintf(name, sizeof name, "%s", "我是从线程");
int n = pthread_create(&thread, nullptr, fun, (void *)name);
int* ret;
sleep(2);
int m=pthread_join(thread,(void**)&ret);
cout<<m<<endl;
while(true)
{
sleep(1);
}
return 0;
}
运行结果,返现m不是0,而是22;