系统教程导读

收集整理了【关于Linux下的多线程】操作系统教程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2908字,纯文字阅读大概需要5分钟

系统教程内容图文

【一、线程的创建】

【 头文件】

【 #include 】

【 函数声明】

【 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);】

【 在一个线程中调用pthread_create函数创建新的线程后,当前线程从pthread_create处继续往下执行,start_routine为新创建线程的入口函数,start_routine函数接收一个参数,是通过pthread_create的arg参数传递给它的,该参数的类型为void* ,这个指针按什么类型解释由调用者自己定义,start_routine的返回值类型也是void,这个指针的含义同样由调用者自己定义,start_routine返回时,这个线程就退出了,其它线程可以调用pthread_join得到start_routine的返回值。】

【 参数说明】

【 第一个参数为指向线程标识符的指针。】

【 第二个参数用来设置线程属性,用于指定各种不同的线程属性。】

【 第三个参数是线程运行函数的起始地址,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。】

【 最后一个参数是运行函数的参数。】

【 返回值】

【 若线程创建成功,则返回0,若线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。】

【 第一个简单的线程程序】

【 #include 】

【 #include 】

【 void printThread(const char *s)】

【 {】

【 pid_t pid;】

【 pthread_t tid;】

【 pid = getpid();】

【 tid = pthread_self();】

【 printf(”%s pid %u tid %u (0x%x) “, s, (unsigned int) pid, (unsigned int) tid, (unsigned int) tid);】

【 }】

【 void* run(void* arg)】

【 {】

【 printThread(”new thread: “);】

【 return NULL;】

【 }】

【 int main(void)】

【 {】

【 pthread_t pt;】

【 int err = pthread_create(&pt, NULL, run, NULL);】

【 if (err != 0)】

【 printf(”can’t create thread: %s “, strerror(err));】

【 printThread(”main thread:”);】

【 pthread_join(pt, NULL);】

【 return 0;】

【 }】

【 注意】

【 因为pthread并非Linux系统的默认库,而是POSIX线程库。在Linux中将其作为一个库来使用,因此加上 -lpthread(或-pthread)以显式链接该库。】

【 $g++ main.cpp -lpthread -o main】

【 $./main】

【 二、pthread_join函数】

【 函数声明】

【 int pthread_join(pthread_t thread, void **retval);】

【 参数说明】

【 thread: 线程标识符,即线程ID,标识唯一线程。】

【 retval: 用户定义的指针,用来存储被等待线程的返回值。】

【 描述】

【 pthread_join函数,阻塞当前线程的执行,以等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的,新创建的线程默认就是joinable的。】

 

【 三、线程的两种状态:joinable(默认)和detached】

【 joinable线程可以被其他线程回收,在被其他线程回收之前,它所占用的存储器资源并不被释放,而detached线程不能被其他线程回收,它占用的存储器资源由系统自动释放。】

【 在默认情况下,线程是joinable的,只有当pthread_join函数返回时,创建的线程才算终止,才能释放自己占用的系统资源,而detached线程没有被其他线程等待,线程执行完毕立马释放系统资源。】

【 设置线程状态的函数pthread_attr_setdetachstate,函数声明为pthread_attr_setdetachstate(pthread_attr_t* attr, int detachstate);其中第二个参数是可选的PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。】

【 如果设置一个线程为分离线程,而这个线程运行又非常快,它很可能在pthread_create函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施,最简单的方法之一是可以在被创建的线程里调用pthread_cond_timewait函数,让这个线程等待一会儿,留出足够的时间让函数pthread_create返回。设置一段等待时间,是在多线程编程里常用的方法。但是注意不要使用诸如 wait 之类的函数,它们是使整个进程睡眠,并不能解决线程同步的问题。】

【 如果进程中的某个线程执行了pthread_detach(th),则th线程将处于DETACHED状态,这使得th线程在结束运行时自行释放所占用的内存资源,同时也无法由pthread_join()同步,pthread_detach()执行之后,对th请求pthread_join()将返回错误。】

【 四、linux下多线程属性设置】

【 attr的缺省属性值】

【 pthread_attr_t attr;

【初始化属性】

【 pthread_attr_t attr;】

【 pthread_attr_init(&attr);】

【 pthread_attr_init 成功完成后将返回0,其他任何返回值都表示出现了错误,并将返回对应的值。】

【 销毁属性】

【 使用  pthread_attr_destroy(&attr) 删除初始化期间分配的存储空间,属性对象将会无效,函数成功完成后将返回0,其他任何返回值都表示出现了错误,并将返回对应的值。】

【本文来自http://www.win7cn.com/如需转载请注明!推荐:win7纯净版】

系统教程总结

以上是为您收集整理的【关于Linux下的多线程】操作系统教程的全部内容,希望文章能够帮你了解操作系统教程关于Linux下的多线程
如果觉得操作系统教程内容还不错,欢迎将网站推荐给好友。

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 关于Linux下的多线程