Chinaunix首页 | 论坛 | 博客
  • 博客访问: 426696
  • 博文数量: 103
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-11 17:22
文章分类
文章存档

2008年(77)

2007年(26)

我的朋友

分类: LINUX

2008-04-14 14:49:51

三.线程安全与可重入:
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;
}

阅读(1282) | 评论(0) | 转发(0) |
0

上一篇:"并发"与"并行"

下一篇:ACM练习建议

给主人留下些什么吧!~~