当前位置: 技术问答>linux和unix
关于线程属性的销毁
来源: 互联网 发布时间:2016-06-23
本文导语: 我想问是不是只要初始化了线程的属性就一定要最后销毁。 还有很代码都是这样 pthread_attr_init(); pthread_create(); pthread_attr_destroy(); 先初始化,然后创建,就立马销毁。。这是为什么,这样销毁不会影响线程的属性么? ...
我想问是不是只要初始化了线程的属性就一定要最后销毁。
还有很代码都是这样
pthread_attr_init();
pthread_create();
pthread_attr_destroy();
先初始化,然后创建,就立马销毁。。这是为什么,这样销毁不会影响线程的属性么?
还有个问题就是,我发现如果不用pthread_join();主线程不会等待子线程结束,当主线程一运行完,不管主线程是否结束都会结束,这样子线程也结束了~~那么这样,如果子线程是分离线程不是会经常会运行不完?想要将子线程运行完,就要让主线程阻塞或者等待~~~有没有办法主线程结束了,子线程还能运行,或者是让子线程单独分出来~~
还有很代码都是这样
pthread_attr_init();
pthread_create();
pthread_attr_destroy();
先初始化,然后创建,就立马销毁。。这是为什么,这样销毁不会影响线程的属性么?
还有个问题就是,我发现如果不用pthread_join();主线程不会等待子线程结束,当主线程一运行完,不管主线程是否结束都会结束,这样子线程也结束了~~那么这样,如果子线程是分离线程不是会经常会运行不完?想要将子线程运行完,就要让主线程阻塞或者等待~~~有没有办法主线程结束了,子线程还能运行,或者是让子线程单独分出来~~
|
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&tid, &attr, routine, arg);
pthread_attr_destroy(&attr);
这里,attr就是给pthread_create使用的,当调用了pthread_create后,attr的属性值就设置到了tid的线程数据结构中去了,而不再需要attr了。当然,紧接着就可以pthread_attr_destroy(&attr)了。线程本身在内核里面有其运行的数据结构和调度状态信息.
每个进程都有一个主线程。当主线程退出后,意味着整个进程就退出了。所以,没有办法还保留其他子线程单独运行。
pthread_attr_init(&attr);
pthread_create(&tid, &attr, routine, arg);
pthread_attr_destroy(&attr);
这里,attr就是给pthread_create使用的,当调用了pthread_create后,attr的属性值就设置到了tid的线程数据结构中去了,而不再需要attr了。当然,紧接着就可以pthread_attr_destroy(&attr)了。线程本身在内核里面有其运行的数据结构和调度状态信息.
每个进程都有一个主线程。当主线程退出后,意味着整个进程就退出了。所以,没有办法还保留其他子线程单独运行。
|
用pthread_attr_init();来初始化pthread_attr_t结构,这个结构中包含的是操作系统实现支持的线程的所有默认属性值。如果要修改个别属性值,就用相关函数,比如:pthread_attr_setdetachstate()函数,设置创建分离线程。
用pthread_create();给定属性结构,创建线程。当创建完线程后,init函数所初始化的属性结构就没用了。但系统在实现时有可能为属性对象分配了动态对象。所以需要调用pthread_attr_destroy释放内存空间。
有没有办法让子线程单独分出来?
这个恐怕是不行的。
真想分出来,那就用子进程好了。
用pthread_create();给定属性结构,创建线程。当创建完线程后,init函数所初始化的属性结构就没用了。但系统在实现时有可能为属性对象分配了动态对象。所以需要调用pthread_attr_destroy释放内存空间。
有没有办法让子线程单独分出来?
这个恐怕是不行的。
真想分出来,那就用子进程好了。
|
在Linux中,用多线程编程与用多进程来编程相比其实并没有太大的优势,因为Linux中的进程是非常轻量级的。线程间由于共享很多东西,控制起来比较难。多进程编程则有成熟的IPC通信机制(信号、共享内存、消息队列),控制起来比较容易。因此,除非对性能的要求非常苛刻,否则用多进程来实现其实更方便,有些功能也更容易实现。
|
cleanup ???
....
pthread_cancel()
pthread_joni()
....
....
pthread_cancel()
pthread_joni()
....
|
纠正一下我上面最后的结论.那个结论曾经是来自于我早先看过的一本书.现在看来是错误的.
但现在我又查实了一下资料,并经过测试,得到结论,可以让主线程先退出,而让其他的线程继续运行,当然,整个进程也还在运行.方法出奇地简单,就是在main函数中,不要使用exit()或者return命令,而是调用pthread_exit,就可以仅仅让让主线程先退出了.
但现在我又查实了一下资料,并经过测试,得到结论,可以让主线程先退出,而让其他的线程继续运行,当然,整个进程也还在运行.方法出奇地简单,就是在main函数中,不要使用exit()或者return命令,而是调用pthread_exit,就可以仅仅让让主线程先退出了.
|
学习中