精华内容
下载资源
问答
  • C语言线程相关函数

    2021-01-24 16:14:32
    ... 目录 创建线程和结束线程 线程属性 ...创建线程和结束线程 (1)线程创建函数 int pthread_create ( pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *),

    另外一篇博客,请点击!


    本篇博客为转载,原文请点击!


    创建线程和结束线程

    (1)线程创建函数

    int pthread_create ( pthread_t *thread, 
                         const pthread_attr_t *attr, 
                         void *(*start_routine) (void *), 
                         void *arg);
    

    功能:创建一个具有指定参数的线程。

    形参:thread是要创建的线程的线程ID指针。

    pthread_t类型的定义是 typedef unsigned long int pthread_t(打印时要使用%lu或%u方式)。

    attr:创建线程时的线程属性(设置NULL表示使用默认线程属性)。

    start_routine:指向的是新线程将运行的函数。线程一旦被创建好,内核就可以调度内核线程来执行start_routine函数指针所指向的函数了。

    arg:指向的是运行函数的形参。

    返回值:若是成功建立线程返回0,否则返回错误的编号。

    线程属性操作,请点击!


     

    (2)等待线程结束函数

    int pthread_join(pthread_t thread, void **retval);

    功能:这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。

    形参:thread是被等待的线程标识符。

    retval:一个用户定义的指针,它可以用来存储被等待线程的返回值。

    返回值:成功返回0,否则返回错误的编号。

    错误码:

    EDEADLK:可能引起死锁,比如两个线程互相针对对方调用pthread_join,或者线程对自身调用pthread_join。

    EINVAL:目标线程是不可回收的,或者已经有其他线程在回收目标线程。

    ESRCH:目标线程不存在。

     

    (3)线程退出函数

    void pthread_exit(void *retval);

    功能:线程函数在结束时调用此函数,以确保安全、干净地退出。

    形参:retval是函数的返回指针,只要pthread_join中的第二个参数retval不是NULL,这个值将被传递给retvalpthread_exit函数通过retval参数向线程的回收者传递其退出信息。他执行完之后不会返回到调用者,而且永远不会失败。

     

    (4)线程取消函数

    int pthread_cancel(pthread_t thread);

    功能:取消某个线程的执行。

    形参:thread是要取消线程的标识符ID。

    返回值:若是成功返回0,否则返回错误的编号。

    但是,接收到取消请求的目标线程可以决定是否允许被取消以及如何取消,这分别由如下两个函数完成。

    int pthread_setcancelstate(int state, int *oldstate);
    int pthread_setcanceltype(int type, int *oldtype);
    

    这两个函数的第一个参数分别用于设置线程的取消状态(是否允许取消)和取消类型(如何取消),第二个参数则分别记录线程原来的取消状态和取消类型。

    state参数有两个可选值:

    PTHREAD_CANCEL_CNABLE,允许线程被取消。它是线程被创建时的默认取消状态。

    PTHREAD_CANCEL_DISABLE,禁止线程被取消。这种情况下,如果一个线程收到取消请求,则它会将请求挂起,直到该线程允许被取消。

    type参数也有两个可选值:

    PTHREAD_CANCEL_ASYNCHRONOUS,线程随时都可以被取消。它将使得接收到取消请求的目标线程立即采取行动。

    PTHREAD_CANCEL_DEFERRED,允许目标线程推迟行动,直到它调用了下面几个所谓的取消点函数中的一个:pthread_join、pthread_testcancel、pthread_cond_wait、pthread_cond_timedwait、sem_wait和sigwait。根据POSIX标准,其他可能阻塞的系统调用,比如read、wait,也可以成为取消点。不过为了安全起见,最好在可能会被取消的代码中调用pthread_testcancel函数设置取消点。

     

    (5)获取当前线程ID函数

    pthread_t pthread_self (void);

    功能:获取当前调用线程的线程ID。

    返回值:当前线程的线程ID标识。

     

    (6)分离释放线程函数

    int pthread_detach (pthread_t thread);

    功能:允许分离执行线程,即独立的执行。同时也是线程资源释放方式设置函数,一旦线程退出,则释放分配的资源。

    形参:thread是要释放线程的标识符ID。

    返回值:若是成功返回0,否则返回错误的编号。

    其他说明:linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态。一个线程默认的状态是joinable,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时,都不会释放线程所占用堆栈和线程描述符(总计8K多),只有当调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己设置,如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。如果线程状态为joinable,需要在之后适时调用pthread_join。

     

    (7)比较两个线程是否为同一线程

    int pthread_equal (pthread_t thread1, pthread_t thread2);

    功能:判断两个线程ID是否是同一个。

    形参:thread1是要比较的线程的标识符ID1;thread2是要比较的线程的标识符ID2。

    返回值:不相等返回0,相等非零。

     

    (8)创建线程私有数据

    int pthread_key_create (pthread_key_t *key, void (*destr_function) (void *));

    功能:创建线程私有数据TSD,提供线程私有的全局变量。使用同名而不同内存地址的线程私有数据结构。

    形参:Key是线程私有数据。

    第二个参数:如果第二个参数不为空,在线程退出时将以key所关联数据为参数调用其指向的资源释放函数,以释放分配的缓冲区。

    其他说明:不论哪个线程调用pthread_key_create()函数,所创建的key都是所有线程可访问的,但各个线程可根据自己的需要往key中填入不同的值 相当于提供了同名不同值的全局变量,各线程对自己私有数据操作互相不影响。

     

    注销线程私有数据

    int pthread_key_delete (pthread_key_t *key);

    该函数并不检查当前是否有线程正是用该TSD,也不会调用清理函数(destr_function) 将TSD释放以供下一次调用pthread_key_create()使用。

     

    (9)读写线程私有数据

    1. int pthread_setspecific (pthread_key_t key, const void *pointer)//写
    2. void pthread_getspecific (pthread_key_t key); //读

    函数pthread_setspecific()将pointer的值(非内容)与key相关联。函数pthread_getspecific()将与key相关联的数据读出来。所有数据都设置为void *,因此可以指向任何类型的数据。

     

    线程属性

    (1)初始化线程对象属性

    int pthread_attr_init (pthread_attr_t *attr);

    功能:pthread_attr_init实现时为属性对象分配了动态内存空间。

    形参:attr是指向一个线程属性的指针。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (2)销毁线程对象属性

    int pthread_attr_destroy (pthread_attr_t *attr);

    功能:经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。只有再次初始化后才能继续使用。

    形参:attr是指向一个线程属性的指针。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (3)获取线程分离状态属性

    int pthread_attr_getdetachstate (pthread_attr_t *attr, int *detachstate);

    功能:获取线程分离状态属性;另外,pthread_detach()是分离释放线程资源函数

    形参:attr是指向一个线程属性的指针。

    detachstate:保存返回的分离状态属性。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (4)修改线程分离状态属性

    int pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate);

    功能:修改线程分离状态属性。

    形参:attr是指向一个线程属性的指针。

    detachstate:其含义是线程的脱离状态,它有两个可选值,分别是PTHREAD_CREATE_JOINABLE(可连接)以及PTHREAD_CREATE_DETACHED(分离)。前者指定线程是可以被回收的,后者使调用线程脱离与进程中其他线程同步。脱离了与其他线程同步的线程成为”脱离线程”。脱离线程在退出时将自行释放其占用的系统资源。线程创建时该属性的默认值是PTHREAD_CREATE_JOINABL此外,我们可以使用pthread_detach函数直接将线程设置为脱离线程。(上述detachstate的含义相同,之后相同含义的参数,都只介绍一次)

    返回值:若是成功返回0,否则返回错误的编号。

     

    (5)获取线程的CPU亲缘性

    int pthread_attr_getaffinity_np (pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset);

    功能:获取线程的CPU亲缘属性。

    形参:attr是指向一个线程属性的指针。

    cpusetsize:指向CPU组的缓冲区大小。

    cpuset:指向CPU组的指针。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (6)设置线程的CPU亲缘性

    int pthread_attr_setaffinity_np (pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);

    功能:通过指定cupset来设置线程的CPU亲缘性。

    形参:attr是指向一个线程属性的指针。

    cpusetsize:指向CPU组的缓冲区大小。

    cpuset:指向CPU组的指针。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (7)获取线程的作用域

    int pthread_attr_getscope (const pthread_attr_t *attr, int *scope);

    功能:指定了作用域也就指定了线程与谁竞争资源。

    形参:attr是指向一个线程属性的指针;scope是返回线程的作用域。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (8)设置线程的作用域

    int pthread_attr_setscope (pthread_attr_t *attr, int scope);

    功能:指定了作用域也就指定了线程与谁竞争资源

    形参:attr是指向一个线程属性的指针。

    scope:线程间竞争CPU的范围,即线程优先级的有效范围。POSIX标准定义了该属性可以取以下两个值:PTHREAD_SCOPE_SYSTEMPTHREAD_SCOPE_PROCESS前者表示目标线程与系统中所有线程一起竞争CPU的使用,后者表示目标线程仅与其他隶属于同一进程的线程竞争CPU的使用。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (9)获取线程的栈保护区大小

    int pthread_attr_getguardsize (const pthread_attr_t *attr, size_t *guardsize);

    功能:获取线程的栈保护区大小。

    形参:attr是指向一个线程属性的指针。

    guardsize:返回获取的栈保护区大小。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (10)设置线程的栈保护区大小

    int pthread_attr_setguardsize (pthread_attr_t *attr, size_t *guardsize);

    功能:参数提供了对栈指针溢出的保护。默认为系统页大小。

    形参:attr是指向一个线程属性的指针。

    guardsize:线程的栈保护区大小。如果guardsize大于0,则系统创建线程的时候会在其堆栈的尾部额外分配guardsize字节的空间,作为保护堆栈不被错误地覆盖的区域。如果guardsize等于0,则系统不为新创建的线程设置堆栈保护区。如果使用者通过pthread_attr_setstack()或pthread_attr_setstackaddr()函数手动设置线程的堆栈,则guardsize属性将被忽略。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (11)获取线程的堆栈信息(栈地址和栈大小)

    int pthread_attr_getstack (const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);

    功能:获取线程的堆栈地址和大小。

    形参:attr是指向一个线程属性的指针。

    stackaddr:返回获取的栈地址。

    stacksize:返回获取的栈大小。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (12)设置线程的堆栈区

    int pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr, size_t stacksize);

    功能:设置堆栈区,将导致pthread_attr_setguardsize失效。

    形参:attr是指向一个线程属性的指针。

    stackaddr:线程的堆栈地址,应该是可移植的,对齐页边距的,可以用posix_memalign来进行获取。

    stacksize:线程的堆栈大小,应该是页大小的整数倍。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (13)获取线程堆栈地址

    int pthread_attr_getstackaddr (const pthread_attr_t *attr, void **stackaddr);

    功能:一般用pthread_attr_getstack来代替。

    形参:attr是指向一个线程属性的指针;stackaddr是返回获取的栈地址。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (14)设置线程堆栈地址

    int pthread_attr_setstackaddr (pthread_attr_t *attr, void *stackaddr);

    功能:一般用pthread_attr_setstack来代替。

    形参:attr是指向一个线程属性的指针;stackaddr是设置线程堆栈地址。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (15)获取线程堆栈大小

    int pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *stacksize);

    功能:获取线程堆栈大小。

    形参:attr是指向一个线程属性的指针;stacksize是返回线程的堆栈大小。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (16)设置线程堆栈大小

    int pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize);

    功能:设置线程堆栈大小。

    形参:attr是指向一个线程属性的指针。

    stacksize:设置线程的堆栈大小,stack属性的合法值包括PTHREAD_STACK_MIN,该线程的用户栈大小将使用默认堆栈大小,为某个线程所需最小堆栈大小,但对于所有线程,这个大小可能无法接受,具体指定的大小,即使用线程的用户堆栈大小的数值,必须不小于最小堆栈大小PTHREAD_STACK_MIN。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (17)获取线程的调度策略

    int pthread_attr_getschedpolicy (const pthread_attr_t *attr, int *policy);

    功能:获取线程的调度策略。

    形参:attr是指向一个线程属性的指针;policy是返回线程的调度策略。

    返回值:若是成功返回0,否则返回错误的编号。

    按照如下方法使用sched_get_priority_max()和sched_get_priority_min(),可以得到优先级的最大值和最小值。 
    头文件:#include <pthread.h> #include <sched.h>

    调用形式:

    1. #include <sched.h>
    2. int sched_get_priority_max(int policy);
    3. int sched_get_priority_min(int policy);

     

    (18)设置线程的调度策略

    int pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy);

    头文件:#include <pthread.h> #include <sched.h>

    功能:设置线程的调度策略。

    形参:attr是指向一个线程属性的指针。

    policy:线程的调度策略,POSIX指定了3种调度策略属性:SCHED_FIFO表示先入先出策略SCHED_RR表示轮转调度(这两种调度方法都具备实时调度功能,但只能用于以超级用户身份运行的进程),SCHED_OTHER是系统默认策略,SCHED_OTHER是不支持优先级使用的。SCHED_FIFO和SCHED_RR支持优先级的使用,它们分别为1和99,数值越大优先级越高。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (19)获取线程的调度参数

    int pthread_attr_getschedparam (const pthread_attr_t *attr, struct sched_param *param);

    头文件:#include <pthread.h> #include <sched.h>

    功能:获取线程的调度参数。

    形参:attr是指向一个线程属性的指针;param是返回获取的调度参数。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (20)设置线程的调度参数

    int pthread_attr_setschedparam (pthread_attr_t *attr, const struct sched_param *param);

    头文件:#include <pthread.h> #include <sched.h>

    功能:设置线程的调度参数,用于设置优先级。

    形参:attr是指向一个线程属性的指针。

    param:要设置的调度参数,其类型是sched_param结构体。至少需要定义这个数据成员

    1. struct sched_param
    2. {
    3. int sched_priority;
    4. /*该成员表示线程运行优先级*/
    5. };

    sched_param可能还有其他的数据成员,以及多个用来返回和设置最小优先级、最大优先级、调度器、参数等的函数。如果调度策略是SCHED_FIFO或SCHED_RR,那么要求具有值的唯一成员是sched_priority。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (21)获取线程是否继承调度属性

    int pthread_attr_getinheritsched (const pthread_attr_t *attr, int *inheritsched);

    头文件:#include <pthread.h> #include <sched.h>

    功能:获取线程是否继承调度属性。

    形参:attr是指向一个线程属性的指针;inheritsched是返回继承调度属性的设置。

    返回值:若是成功返回0,否则返回错误的编号。

     

    (22)设置线程继承调度属性

    int pthread_attr_setinheritsched (pthread_attr_t *attr, int inheritsched);

    头文件:#include <pthread.h> #include <sched.h>

    功能:设置线程是否继承调度属性。

    形参:attr是指向一个线程属性的指针。

    Inheritsched:设置线程是否继承调用线程的调度属性,可能取值如下:

    PTHREAD_INHERIT_SCHED表示新线程沿用其创建者的线程调度参数这种情况下再设置新线程的调度参数属性将没有任何效果PTHREAD_EXPLICIT_SCHED表示调用者要明确地指定新线程的调度参数

    返回值:若是成功返回0,否则返回错误的编号。

    展开全文
  • Linux C语言线程函数参数传入

    千次阅读 2019-02-15 00:20:55
    线程函数参数由结构体指针传入 #include &lt;pthread.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; typedef struct { char name[20]; int time; int start; int end...

    线程中函数参数由结构体指针传入

    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct
    {
    	char name[20];
    	int time;
    	int start;
    	int end;
    
    }RaceArg;
    
    void* th_fn(void *arg)
    {
    	RaceArg *r = (RaceArg*)arg;
    	int i;
    	for(i=r->start;i<=r->end;i++)
    	{
    		printf("%s(%lx) running %d\n",
    			r->name, pthread_self(),i);
    		usleep(r->time);
    	}
    }
    
    int main(void)
    {
    	int err;
    	pthread_t rabbit, turtle;
    
    	RaceArg r_a = {"rabbit", (int)(drand48()*10000000), 20, 50};
    
    	RaceArg t_a = {"turtle", (int)(drand48()*10000000), 10, 60};
    
    	if((err = pthread_create(&rabbit, NULL, th_fn, (void*)&r_a))!=0)
    	{
    		perror("pthread_create error");
    	}
    
    	if((err = pthread_create(&turtle, NULL, th_fn, (void*)&t_a))!=0)
    	{
    		perror("pthread_create error");
    	}
    
    
    	pthread_join(rabbit, NULL);
    	pthread_join(turtle, NULL);
    
    	printf("control thread id: %lx\n", pthread_self());
            printf("finished\n");
    
    	return 0;
    }
    
    

     

    展开全文
  • C语言 线程

    2019-04-24 20:56:17
    线程除了内存中的栈区不共享,其他的都共享(因为线程本质就是执行一个函数) 如果只有一个cpu多线程是无用的,因为同一时间一个进程只能获得一个cpu light weight process 轻量级的进程,本质仍是进程 Linux下: 线程...

    基础

    1. 线程除了内存中的栈区不共享,其他的都共享(因为线程本质就是执行一个函数)
    2. 如果只有一个cpu多线程是无用的,因为同一时间一个进程只能获得一个cpu
    3. light weight process 轻量级的进程,本质仍是进程
      线程:最小的执行单位,有PCB,但没有地址空间(共享进程的)
      进程:最小分配资源单位,可看成是只有一个线程的进程。有PCB,有独立的地址空间
      ps –Lf pid 查看多线程进程

    线程与进程

    进程 线程
    fork pthread_create
    exit pthread_exit
    wait pthread_join
    kill pthread_cancel
    getpid pthread_self

    线程属性

    属性 描述
    int etachstate; //线程的分离状态
    int schedpolicy; //线程调度策略
    struct sched_param schedparam; //线程的调度参数
    int inheritsched; //线程的继承性
    int scope; //线程的作用域
    size_t guardsize; //线程栈末尾的警戒缓冲区大小
    int stackaddr_set; //线程的栈设置
    void* stackaddr; //线程栈的位置
    size_t stacksize; //线程栈的大小
    展开全文
  • C语言atoi函数是用来将字符串转化为int型整数的,itoa功能相反。下面是我自己实现的这两个函数,均为线程安全的。代码如下:#include #include #include #include #include #include <cmath>using namespace ...

    C语言atoi函数是用来将字符串转化为int型整数的,itoa功能相反。下面是我自己实现的这两个函数,均为线程安全的。代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <malloc.h>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    //将一个字符转化为数字
    int chartoi(const char cp)
    {
        if ('0' <= cp&&'9' >= cp)
        {
            //字符数字在内存中的值都是通过自身加上0x30得到的
            return cp - 0x30; 
        }
        else
        {
            printf_s("error input.%s, %d", __FILE__, __LINE__);
            return -1;
        }
    }
    
    //内置类型,直接传值
    int myatoi(const char* ptr)
    {
        const char* tmptr = NULL;
        int neg = 0;
        int len = 0, temp_len = 0;
        int value = 0;
    
        len = strlen(ptr);
        temp_len = len;
    
        if ('-' == ptr[0])
        {
            tmptr = ptr + 1;
            --temp_len;
        }
        else
        {
            neg = 1;
            tmptr = ptr;
        }
    
        while (temp_len > 0)
        {
            value += chartoi(*tmptr) * pow(10, (temp_len - 1));
            temp_len--;
            tmptr++;
        }
    
        if (neg == 0)
            return 0 - value;
        else
            return value;
    }
    
    //线程安全版本1(由用户自己制定一块内存并将地址传入,
    //此内存可以为栈上的也可以是堆上的)
    int myitoa(int num, char* ptr)
    {
        if (NULL == ptr)
            return 1;
    
        int neg = 0, i = 0;
        int temp = num;
        char buf[128];
        memset(buf, 0, sizeof(buf));
    
        if (num > 0)
            neg = 1;
        else
            temp = 0 - num;
    
        while (temp > 0)
        {
            buf[i++] = temp % 10 + 0x30;
            temp /= 10;
        }
        if (neg == 0)
        {
            buf[i] = '-';
        }
        reverse(buf, buf+strlen(buf));
    
        sprintf_s(ptr, strlen(buf)+1, buf);
    
        return 0;
    }
    
    //线程安全版本2(直接通过函数在堆上开辟内存并传出,
    //注意使用完需要free堆上的内存)
    char* myitoa(int num)
    {
        int neg = 0, i = 0;
        int temp = num;
    
        char* buf = (char*)malloc(128);
        if (NULL == buf)
            return NULL;
    
        if (num > 0)
            neg = 1;
        else
            temp = 0 - num;
    
        while (temp > 0)
        {
            buf[i++] = temp % 10 + 0x30;
            temp /= 10;
        }
        if (neg == 0)
        {
            buf[i++] = '-';
            buf[i] = '\0';
        }
        else
        {
            buf[i] = '\0';
        }
    
        reverse(buf, buf + strlen(buf));
    
        return buf;
    }
    
    //线程安全版本3(通过传入二级指针在函数内部向堆上申请内存,也可以通过
    //传入指针的引用实现,但是需注意使用完了之后需要free堆上的内存)
    int myitoa(int num, char** ptr)
    {
        int neg = 0, i = 0;
        int temp = num;
    
        *ptr = (char*)malloc(128);
        if (NULL == ptr)
        {
            return 1;
        }
    
        if (num > 0)
            neg = 1;
        else
            temp = 0 - num;
    
        while (temp > 0)
        {
            (*ptr)[i++] = temp % 10 + 0x30;
            temp /= 10;
        }
        if (neg == 0)
        {
            (*ptr)[i++] = '-';
            (*ptr)[i] = '\0';
        }
        else
        {
            (*ptr)[i] = '\0';
        }
    
        reverse(*ptr, *ptr + strlen(*ptr));
    
        return 0;
    }
    
    int main()
    {
        char *p = "-123";
        int a = -123;
        char* buf;
    
        //myitoa(a, &buf);
    
        printf("%d\n", myatoi(p));
        //printf("%s\n", buf);
        //free(buf);
    
        return 0;
    }
    展开全文
  • c语言线程安全

    2021-03-10 14:20:52
    C语言中大部分函库函数都是线程安全的,但是也有几个常用函数线程不安全的,也叫不可重入函数线程不安全函数原因浅析 之所线程不安全,是因为这些系统函数使用了某些全局或者静态变量。我们知道,全局变量和...
  • 最近学习需要,接触了C语言的多线程,网上搜索到的例子都不太容易理解,很多还是使用C++知识的,特别对于小白来说学习起来更加困难。因此在这里分享一下自己的学习心得,本文只涉及基本的C语言
  • C语言线程安全:不可重入函数汇总

    千次阅读 2018-02-27 15:58:47
    C语言中大部分函库函数都是线程安全的,但是也有几个常用函数线程不安全的,也叫不可重入函数线程不安全函数原因浅析之所线程不安全,是因为这些系统函数使用了某些全局或者静态变量。我们知道,全局变量和静态...
  • 本文实例讲述了C++开启线程CreatThread函数的...具体实现代码如下://线程函数DWORD WINAPI ThreadProc(LPVOID lpParameter){for (int i=0;i<20;i++){printf("I'm in thread,count=%d\n",i);}return 0;}int _tmai...
  • C语言线程

    2010-08-21 23:19:55
    线程相关操作 一 pthread_t pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义: typedef unsigned long int pthread_t;... 它是一个线程的标识符。... 函数pthread_create用来创...
  • linux下c语言线程

    2020-05-25 11:22:49
    线程创建函数包含四个变量,分别为: 1. 一个线程变量名,被创建线程的标识 2. 线程的属性指针,缺省为NULL即可 3. 被创建线程的程序代码 4. 程序代码的参数 For example: - pthread_t thrd1; - pthread_attr_t ...
  • 原文地址:linux下C语言线程的介绍作者:Ree雪影 今天一天小记。。 linux下线程的介绍 下面是主要的函数介绍: 创建线程要实现的函数  int pthread_create(pthread_t *thread,pthread_attr_t *attr,void * ...
  • linux c语言 select函数用法        Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或...
  • C语言线程编程-线程的基本函数

    万次阅读 多人点赞 2017-04-06 22:33:21
    线程操作函数线程属性控制函数
  • 异步执行函数线程Dome 调用MSVC CRT的函数_beginthread()或_beginthreadex()来创建线程。 _beginthread 参数和返回值 unsigned long _beginthread( void(_cdecl *start_address)(void *), //声明为void (*start_...
  • #include <pthread.h><br />1. int pthread_create(pthread_t *... //创建新线程 2. void pthread_exit(void *retval); //终止线程 3. int pthread_join(pthread_t th,void **thread_return);
  • 下面小编就为大家带来一篇关于C语言线程pthread库的相关函数说明。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 在Linux环境下用C语言编写线程创建。 1 //file name: pthreadtext.c 2 3 #include <stdio.h> 4 #include <pthread.h> //线程头文件 5 //pthread不是linux下的默认的库,也就是在链接的...
  • c语言线程安全函数引发的BUG一列  公司的机器最近遇到一个bug(其实这个bug一年前就出现过,只是未引起重视),现象是这样的:在生产环境中,用户连续打印票的时候,中间某张票的一个时间可能会出问题,该时间本来是一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,710
精华内容 684
关键字:

c语言线程函数

c语言 订阅