三.线程安全与可重入:
1.如果一个函数在同一时刻能够被多个线程安全的调用,则这个函数就是“线程安全“的。
很多函数不是线程安全的,因为它们返回的数据存放在静态的内存缓冲区中,通过修改接口,调用者可以自己提供缓冲区,从而使函数
变为线程安全的。
2.在多线程或者有异常控制流的情况下,当某个函数运行到中途时,控制流(也就是当前的指令序列)有可能被打断而去执行另一个函数,而“另一个
函数“很可能就是它本身,如果在这种情况下不会出现问题,那么这个函数就被称作是“可重入“的。
3.可重入的函数一定是线程安全的,线程安全的函数可能是重入的也可能不是重入的,但是线程不安全的函数一定不是可重入的。
四.pthread_join和pthread_exit等待线程结束:
程序调用pthread_create产生一个线程,然后调用pthread_join等待线程的结束。不一定需要等待线程的结束,但是若不这样做,需要其它绶带保证进程一直运行到所有线程
都结束。从main函数返回可以导致进程内所有线程终止。可以在main函数里调用pthread_exit,这样进程就必须等到所有线程结束后才能终止。
#include "errors.h"
static void *fun(void *arg);
int main(int argc, char **argv)
{
pthread_t thread;
int status;
void *value = NULL;
char *arg = "return from child thread";
status = pthread_create(&thread, NULL, fun, (void *)arg);
if(status != 0){
err_abort(status, "Create thread");
}
/***
status = pthread_join(thread, &value);
if(status != 0){
err_abort(status, "Join thread");
}
printf("%s\n", (char *)value);
***/
pthread_exit(NULL);
printf("All thread exited!\n");//不会执行到,因为5s后main退出
exit(0);
}
static void *fun(void *arg)
{
sleep(5);
return arg;
}
|
阅读(1321) | 评论(0) | 转发(0) |