pthread_create函数

tinyHttpd中的main()函数:

int main(void)  
{  
    int server_sock = -1;  
    u_short port = 0;  
    int client_sock = -1;  
    struct sockaddr_in client_name;  
    int client_name_len = sizeof(client_name);  
    pthread_t newthread;  
  
    /*在对应端口建立 httpd 服务*/  
    server_sock = startup(&port);  
    printf("httpd running on port %d\n", port);  
  
    while (1)  
    {  
        /*套接字收到客户端连接请求*/  
        client_sock = accept(server_sock,(struct sockaddr *)&client_name,&client_name_len);  
        if (client_sock == -1)  
            error_die("accept");  

        /*派生新线程用 accept_request 函数处理新请求*/  
        /* accept_request(client_sock); */  
        if (pthread_create(&newthread , NULL, accept_request, client_sock) != 0)  
            perror("pthread_create");  
    }  
  
    close(server_sock);  
  
    return(0);  
}

pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。

一、头文件:pthread.h

二、函数声明:

int pthread_create(pthread_t *restrict tidp,
                   const pthread_attr_t *restrict attr,
                   void *(*start_rtn)(void), 
                   void *restrict arg);
       1. tidp为指向线程标识符的指针。返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。
  2. attr用来设置线程属性。
  3. start_rtn是线程运行函数的起始地址,新创建的线程从start_rtn函数的地址开始运行。

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

三、关于restrict

C99 中新增加了 restrict 修饰的指针: 由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。

另外,由于pthread库不是Linux系统默认的库,所以在使用pthread_create创建线程时,需要在编译中请加-lpthread参数。                      eg:gcc -o test -lpthrea test.c

四、返回值

      当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值