Linux下C语言多线程学习之一——线程的创建

来源:互联网 发布:emlog博客源码 编辑:程序博客网 时间:2024/06/05 06:40

目录

  • 目录
  • 线程概念
  • 创建线程示例
  • 线程创建流程解析

1 线程概念

一个进程可以看做是一个控制线程,同时只能做一件事情,而在进程中创建多个线程,可以让进程同时处理多个任务,提高系统响应时间和吞吐量。
进程中的所有信息对该进程的所有线程都是共享的,包括可执行程序文本、全局变量、堆内存、栈以及文件描述符。

2 创建线程示例

#include <pthread.h>#include <stdio.h>void *thread_fn(void *arg){    printf("this is thread, thread_id:%##x, arg:%d\n",            pthread_self(), (int)arg);    return 1;}int main(void){    pthread_t tid;    int err;    err = pthread_create(&tid, NULL, thread_fn, (void *)1);    if(err){        printf("cant`t creat thread: %s\n", strerror(err));        return 0;    }    pthread_join(tid, &rval_p);    printf("thread is end.rval=%d\n", (int)rval_p);    return 0;}

执行结果如下

this is thread, thread_id:0xd26f8700, arg:1thread is end.rval=1

注意:编译多线程程序时,需要指定线程库,即加上-lpthread

3 线程创建流程解析

pthread_t tid:线程id,类似于进程id。线程id类型pthread_t为一个无符号整数,在不同系统中有不同 的表示,可能是unsigend int,也可能是unsigned long等等。在FreeBSD中,使用指向线程数据结构的指针作为线程id。

pthread_create(&tid, NULL, thread_fn, (void *)1);:创建一个线程,原型为:
int pthread_create(pthread_t thread, const pthread_attr_t *attr, void (start_routine) (void ), void *arg);
thread指针指向内存用于存放线程id;
attr为线程属性,这里不设置属性,所以用NULL;
start_routine线程从该函数开始执行,该函数类型为void start_routine(void )。

pthread_self():获取调用线程的线程id,类似与进程的getpid()。原型为 pthread_t pthread_self(void)。

pthread_join:阻塞等待线程结束。如果不使用pthread_join,那么主线程执行完后,整个进程就退出了,此时创建的线程可能还没有执行完。原型 int pthread_join(pthread_t thread, void **retval);
其中thread为线程id,retval为线程的终止状态,如果对线程的终止状态不感兴趣可以设为NULL。

原创粉丝点击