线程的创建,pthread_create,pthread_self,pthread_once

typedef unsigned long int pthread_t;

//come from /usr/include/bits/pthreadtypes.h

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);创建新的线程

pthread_t pthread_self(void);获取本线程的线程ID

int pthread_equal(pthread_t t1, pthread_t t2);判断两个线程ID是否指向同一线程

int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));用来保证init_routine线程函数在进程中只执行一次。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

int* thread_func(void* arg)
{
    pthread_t new_thid;
    new_thid = pthread_self();//打印线程自己的线程ID
    printf("the new thread, ID is %lu\n", new_thid);

    return NULL;
}

int main()
{
    pthread_t thid;

    printf("main thread, ID is %lu\n", pthread_self());//打印主线程自己的线程ID

    if (pthread_create(&thid, NULL, (void*)thread_func, NULL) != 0)
    {
        printf("create thread failed\n");
        exit(0);
    }

    sleep(5);

    return 0;
}

某些情况下,函数执行次数要被限制为1次,这种情况下,要使用pthread_once,代码示例:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

pthread_once_t once = PTHREAD_ONCE_INIT;

void run(void)
{
    printf("function run is running in thread:%lu\n", pthread_self());
}

int* thread1(void* arg)
{
    pthread_t new_thid;
    new_thid = pthread_self();
    printf("current thread ID is %lu\n", new_thid);
    pthread_once(&once, run);
    printf("thread1 end\n");
    return NULL;
}

int* thread2(void* arg)
{
    pthread_t new_thid;
    new_thid = pthread_self();
    printf("current thread ID is %lu\n", new_thid);
    pthread_once(&once, run);
    printf("thread2 end\n");
    return NULL;
}

int main()
{
    pthread_t thid1, thid2;

    printf("main thread, ID is %lu\n", pthread_self());

    pthread_create(&thid1, NULL, (void*)thread1, NULL);
    pthread_create(&thid2, NULL, (void*)thread2, NULL);

    sleep(5);
    printf("main thread exit\n");

    return 0;
}

运行结果:

main thread, ID is 3076200128
current thread ID is 3067804480
function run is running in thread:3067804480
thread2 end
current thread ID is 3076197184
thread1 end
main thread exit

虽然在thread1 跟thread2中都调用了run函数,但是run函数只执行了一次。

时间: 2024-10-19 19:44:36

线程的创建,pthread_create,pthread_self,pthread_once的相关文章

线程的创建pthread_create.c

1 #include <stdio.h> 2 #include <pthread.h> 3 #include <stdlib.h> 4 #include <errno.h> 5 6 void *pthread_fun(void *arg) 7 { 8 int b; 9 b = *(int *)arg; 10 printf("b = %d \n",b); 11 int i = 5 ; 12 while(i > 0) 13 { 14 p

2线程原语:pthread_create(),pthread_self(),pthread_exit(),pthread_join(),pthread_cancel(),pthread_detach(

 1  pthread_create()函数 创建线程 A:依赖的头文件 #include<pthread.h> B:函数声明 int pthread_create(pthread_t *thread, constpthread_attr_t *attr, void *(*start_routine) (void *), void *arg); pthread_t *thread:传递一个pthread_t变量地址进来,用于保存新线程的tid(线程ID) const pthread_att

线程的创建

线程是一种使程序在同一时间做多件事的机制,和进程一样是并发执行的.linux内核调度为每个线程分配一个时间片,使用完后等待下次调度.和进程相比,线程是一种更小的执行单位. 每个进程启动后都会有一个线程在运行,称为主线程,可以在主线程中启动多个子线程,这些线程在同一个进程中,不同线程在给定时间内执行不同的代码片段. 我们可以fork一个子进程,这个子进程就是对父进程的一个copy,包括系统分配的各种资源:虚拟内存.文件描述符等.如果在子进程关闭文件描述符,不会影响父进程对其的读写.但线程不同,每个

Linux C线程的创建和使用 [转]

1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中 去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多 线程就意味着多进程.现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux. 为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题. 使用多线程的理由之一是和进程相比

线程的创建,等待与终止

一.线程的创建 基础知识 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. 一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行.由于线程之间的相互制约,致使线程在运行中呈现出间断性

线程的创建和控制

线程的定义:线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行.由于线程之间的相互制约,致使线程在运行中呈现出间断性.线程也有就

POSIX 线程的创建与退出

前言 创建线程: pthread_create() 退出线程: pthread_exit()return pthread_cancel() 线程的创建 使用多线程,首先就需要创建一个新线程.那么线程是如何被创建的呢,是用下面这个函数创建的. #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *ar

浅析Linux线程的创建

本文首先使用了接口pthread_create创建一个线程,并用strace命令追踪了接口pthread_create创建线程的步骤以及涉及到的系统调用,然后讨论了Linux中线程与进程关系,最后概述了为了实现POSIX线程,Linux内核所做的修改. 使用pthread_create创建线程 在Linux下可以使用pthread_create来创建线程,该接口声明如下: #include <pthread.h> int pthread_create(phtread_t *thread, co

Dalvik虚拟机进程和线程的创建过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8923484 我们知道,在Android系统中,Dalvik虚拟机是运行Linux内核之上的.如果我们把Dalvik虚拟机看作是一台机器,那么它也有进程 和线程的概念.事实上,我们的确是可以在Java代码中创建进程和线程,也就是Dalvik虚拟机进程和线程.那么,这些Dalvik虚拟机所创建的进程 和线程与其宿主Linux内核的进程和线程有什么关