多线程编程(三)——线程创建

    在POSIX线程(pthread)的情况下,程序开始运行时,它也是以单进程中的单个控制线程启动的,
在创建多个控制线程以前,程序的行为与传统的进程行为完全相同。
      1.线程创建
#include <pthread.h>
	
       int pthread_create(pthread_t *restrict tidp,
              const pthread_attr_t *restrict attr,
              void *(*start_routine)(void*), void *restrict arg);
返回值:若成功则返回0, 失败则返回错误编号
    
    线程创建时并不能保证哪个线程会先运行,是新创建的线程还是调用线程。新创建的线程可以访问进程的地址空间,并且继承调用线程的浮点环境和信号屏蔽字,但是该线程的未决信号集被清除。
    2.实例

#include "apue.h"
#include <pthread.h>

pthread_t ntid;

void printids(const char* s)
{
    pid_t pid;
    pthread_t tid;

    pid = getpid();
    tid = pthread_self();

    printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);
}

void* thr_fn(void *arg)
{
    printids("new threads: ");
    return ((void*)NULL);
}

int main(int argc, char** argv)
{
    int err;

    err = pthread_create(&ntid, NULL, thr_fn, NULL);
    if(err != 0)       
       fprintf(stderr, "%d---can't create thread: %s\n", __LINE__, strerror(err));

    printids("main thread:");
    sleep(1);
    exit(0);
} 
在linux上运行结果:
root@ubuntu:/mnt/hgfs/linux/multi_thread# ./win
main thread: pid 2111 tid 3078535984 (0xb77ebb30)
new threads:  pid 2111 tid 3078527856 (0xb77e9b70)
如预期那样,两个线程的进程ID相同,但线程ID不同。注意tid值可能使用指向线程数据结构的指针作为它的线程ID,而不是一个无符号的整数。这与具体的操作系统实现有关(linux具体怎么实现,有待深入了解)。

    这个实例有两个特别之处:
a、需要处理主线程和新线程之间的竞争。主线程需要休眠,否则它就可能退出,这样在新线程有机会运行之前整个进程可能就已终止了了。
b、通过pthread_self函数获取自己的线程ID,而不是从共享内存中读出或者从线程的启动例程中以参数的形式接收到。在本例中,主线程把新线程ID存放在ntid中,但新建的线程并不能安全的使用它,因为如果新线程在主线程调用pthread_create返回之前就运行了,那么线程看到的是未经初始化的ntid的内容,而这个内容并不是正确的线程ID








你可能感兴趣的:(多线程,线程创建)