首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

必须在主函数中调用pthread_create()和pthread_join()吗?

在C/C++中,使用pthread库进行多线程编程时,主函数中调用pthread_create()和pthread_join()是可选的,不是必须的。

pthread_create()函数用于创建一个新的线程,并指定线程的入口函数和参数。它的原型如下:

代码语言:txt
复制
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);

其中,thread参数是指向线程标识符的指针,attr参数是线程的属性,start_routine参数是线程的入口函数,arg参数是传递给线程入口函数的参数。

pthread_join()函数用于等待指定的线程结束,并获取线程的返回值。它的原型如下:

代码语言:txt
复制
int pthread_join(pthread_t thread, void **retval);

其中,thread参数是要等待的线程标识符,retval参数是指向线程返回值的指针。

在主函数中调用pthread_create()和pthread_join()的目的是为了创建并等待子线程的完成,以确保主线程在子线程执行完毕后再继续执行。这样可以避免主线程提前结束导致子线程被强制终止的情况发生。

但是,并不是所有的多线程程序都需要在主函数中调用pthread_create()和pthread_join()。有些情况下,主线程不需要等待子线程的完成,可以继续执行其他任务。例如,当主线程只需要创建子线程来执行一些并行计算任务,而不需要等待子线程的结果时,就可以不调用pthread_join()。

总结起来,主函数中调用pthread_create()和pthread_join()是一种常见的多线程编程模式,但并不是必须的,具体是否需要调用取决于程序的需求和设计。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

手把手教你写linux系统下贪吃蛇(二)

对线程不理解直接看第六部分函数。...(),实现方向的改变,调用函数一) 六)函数 为什么要用线程?...我们的c语言程序一般是单线程的,从函数开始,一行一行执行,遇到函数就跳进函数,线程是让两个函数同时执行。 就像你现在看我的博客又在玩qq,这就是多线程。  ...(pt_refresh,NULL); /*一般来讲,进程各个函数都是独立的,线程的终止并不会通知,也不会影响其他线程,终止的线程占用的资源也不会随着线程的终止得到释放,正如进程可以用wait()系统调用来同步终止并释放一切内存一样...,在linux没有进程,却有类似的函数 pthread_join(); 函数原型:int pthread_join(pthread_t th, void **thread_return) 第一个参数线程

1.1K20

Linux C 编程——多线程

1、线程创建 在Linux,新建的线程并不是在原先的进程,而是系统通过一个系统调用clone()。该系统copy了一个原先进程完全一样的进程,并在这个进程执行线程函数。...,该函数是线程调用函数; arg表示的是传递给线程调用函数的参数。...在函数的sleep()用于将主进程处于等待状态,以让线程执行完成。最终的执行效果如下所示: ? 那么,如何利用arg向子线程传递参数呢?...2、线程挂起 在上述的实现过程,为了使得主线程能够等待每一个子线程执行完成后再退出,使用了free()函数,在Linux的多线程,也可以使用pthread_join()函数用于等待其他线程,函数的具体形式为...: int pthread_join(pthread_t thread, void **retval); 函数pthread_join()用来等待一个线程的结束,其调用这将被挂起。

6.4K40
  • Linux C 编程——多线程

    1、线程创建 在Linux,新建的线程并不是在原先的进程,而是系统通过一个系统调用clone()。该系统copy了一个原先进程完全一样的进程,并在这个进程执行线程函数。...,该函数是线程调用函数; arg表示的是传递给线程调用函数的参数。...在函数的sleep()用于将主进程处于等待状态,以让线程执行完成。最终的执行效果如下所示: ? 那么,如何利用arg向子线程传递参数呢?...2、线程挂起 在上述的实现过程,为了使得主线程能够等待每一个子线程执行完成后再退出,使用了free()函数,在Linux的多线程,也可以使用pthread_join()函数用于等待其他线程,函数的具体形式为...: int pthread_join(pthread_t thread, void **retval); 函数pthread_join()用来等待一个线程的结束,其调用这将被挂起。

    5.3K60

    Linux线程编程专题之线程线程函数介绍

    :    1、线程的创建函数 (主线程用来创造子线程的):              在ubuntu我们使用man  3    pthread_create 来查看它的用法:  PTHREAD_CREATE...当一个线程调用了针对其它线程的pthread_join()接口,就是线程合并了。这个接口会阻塞调用线程,直到被合并的线程结束为止。...之前介绍的输出型参数类似——c专题之指针----指针与函数传参输入、输出型参数) 。...分析说明: 这个函数的作用是,终止调用它的线程。函数参数是函数返回时的代码。...注意一点的是这函数须在pthread_join()函数第二个参数不为NULL的前提下才能够执行 ----------------这个pthread_exit()函数写在被调用子线程     4、获取线程

    91730

    多线程编程C语言版

    线程退出与等待 在Demo1我们用到了pthread_join这个函数 #include int pthread_join(pthread_t thread, void **retval...一个线程对应一个pthread_join()调用,对同一个线程进行多次pthread_join()调用属于逻辑错误,俗称耍流氓。 那么线程什么时候退出?...1.在线程函数运行完后,该线程也就退出了 2.线程内调用函数pthread_exit()主动退出 3.当线程可以被取消时,通过其他线程调用pthread_cancel的时候退出 4.创建线程的进程退出...只有当你调用pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。...,初始化的函数为pthread_attr_init,这个函数须在pthread_create函数之前调用

    3.6K31

    掌握死锁检测:策略最佳实践

    2.1、dlsym()函数获取共享对象或可执行文件符号的地址。...这允许在另一个共享对象函数提供包装,例如,预加载共享对象函数定义可以查找并调用另一共享对象中提供的“真实”函数(或者在预加载有多层的情况下,函数的“下一个”定义)。...2.2、pthread_self()函数获取调用线程的ID。...这与创建此线程的pthread_create()调用*thread返回的值相同。返回值:此函数始终成功,返回调用线程的ID。...hook使用:(1)定义与目标函数一样的类型;(2)具体函数实现,函数名与目标函数名一致;(3)调用dlsym()函数,初始化hook。死锁检测可以使用图算法,通过检测有向图是否有环判断是否有死锁。

    14510

    Linux应用开发【第五章】线程编程应用开发

    线程号与进程号是表示线程进程的唯一标识,但是对于线程号而言,其仅仅在其所属的进程上下文中才有意义。...*attr,void *(*start_routine) (void *), void *arg); 成功:返回0 ​ 在传统的程序,一个进程只有一个线程,可以通过函数pthread_create来创建线程...确实可以创建出来线程,主线程执行pthread_create后的tid指向了线程号空间,与子线程通过函数pthread_self打印出来的线程号一致。 ​...5.1.5 向线程传入参数 ​ pthread_create()的最后一个参数的为void *类型的数据,表示可以向线程传递一个void *数据类型的参数,线程的回调函数可以获取该参数,例程3举例了如何向线程传入变量地址与变量值...第一个的线程执行死循环睡眠逻辑,理论上除非进程结束,其永远不会结束,但在第二个线程调用了pthread_cancel函数,相当于向该线程发送一个退出的指令,导致线程被退出,最终资源被非阻塞回收掉。

    1.4K20

    初谈Linux多线程--线程控制

    缺乏访问控制 进程是访问控制的基本粒度,在一个线程调用某些OS函数会对整个进程造成影响。...,在各线程 中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源环境: 文件描述符表、每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数...另外,如果此时还有一个线程,使用的也是td访问的也是函数td变量,那这两个线程如果其中一个线程对td进行修改,那么就会影响另一个线程。...返回值为类对象 主线程创建并启动了一个新的线程,通过 pthread_create pthread_join 实现了线程的创建和等待。...<<endl; delete (const char*)name; } sleep(1); return 0; } 在函数,首先创建一个 vector

    15710

    Linux多线程【线程控制】

    ,线程启动时,会自动回调此函数(类似于 signal 函数的参数2) 参数4 void*:显然,这个类型与回调函数的参数类型匹配上了,而这正是线程运行时,传递给回调函数的参数 返回值 int:创建成功返回...,两者有什么不可告人的秘密?...答案是这俩其实本质上是同一个东西,pthread_join 的 void **retval 是一个输出型参数,可以把一个 void * 指针的地址传递给 pthread_join 函数,当线程调用 pthread_exit...答案是 通过 栈顶指针 ebp 栈底指针 esp 进行切换,ebp esp 是 CPU 两个非常重要的 寄存器,即便是程序启动,也需要借助这两个 寄存器 为 main 函数开辟对应的 栈区...除了移动 esp 扩大栈区外,还可以同时移动 ebp esp 更改当前所处栈区 所以,多线程 独立栈 可以通过 ebp esp 轻松切换并使用 如果想要在栈区开辟整型空间,可以使用 ebp

    21030

    pthread_create 线程属性-Pthread并发编程之线程基本元素状态的剖析

    void func(void arg) {   printf("Hello World from tid = %ld\n", pthread_self()); // pthread_self 返回当前调用这个函数的线程的线程... 创建线程并且执行函数 func    // wait unit thread t finished   pthread_join(t, NULL); // 主线程等待线程 t 执行完成然后主线程才继续往下执行...helloworld.c -o helloworld.out -lpthread 或者 gcc helloworld.c -o helloworld.out -lpthread   在上面的代码当中主线程(可以认为是执行函数的线程... func   pthread_create(&t, NULL, func, (void*)in);    pthread_join(t, NULL);   free(in); // 释放内存空间   ...根据上面的虚拟内存布局示意图,我们将其简化一下得到单个线程的执行流大致的内存布局如下所示(程序执行的时候有他的栈帧以及寄存器现场,图中将寄存器也做出了标识):   程序执行的时候当我们进行函数调用的时候函数的栈帧就会从上往下生长

    44340

    线程(二)线程互斥+线程同步

    常见的线程不安全的情况: 不保护共享变量的函数 函数状态随着被调用,状态发生变化的函数 返回指向静态变量指针的函数 调用线程不安全函数函数 常见线程安全的情况 每个线程对全局变量或者静态变量只有读取的权限...或者new开辟出的空间 不调用不可重入函数 不返回静态或全局数据,所有数据都有函数调用者提供 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据 可重入与线程安全联系 函数是可重入的,那就是线程安全的...(&t1, NULL, r1, NULL); pthread_create(&t2, NULL, r2, NULL); pthread_join(t1, NULL); pthread_join...没有互斥锁就无法安全的获取修改共享数据。 由于解锁等待不是原子操作。...所以解锁等待必须是一个原子操作。

    1.2K10

    Linux多线程编程实例解析

    :7: 警告: 在有返回值的函数,程序流程到达函数尾   /tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):对‘pthread_create...他集成了进程的所有信息都是对线程进行共享的,包括文本程序、程序的全局内存堆内存、栈以及文件描述符   例程5:   程序目的:验证新建立的线程可以共享进程的数据   程序名称:pthread_share.c...线程的正常退出的方式:   (1) 线程只是从启动例程返回,返回值是线程的退出码   (2) 线程可以被另一个进程进行终止   (3) 线程自己调用pthread_exit函数   两个重要的函数原型...头文件 : #include   函数定义: int pthread_join(pthread_t thread, void **retval);   描述 :pthread_join()函数,以阻塞的方式等待...,函数说明   例程8   程序目的:实现在新建立的线程打印该线程的id进程id   代码如下:   #include   #include   #include /*getpid()*/   void

    2.4K40

    Linux下的多线程编程实例解析

    上面的示例,我们使用到了两个函数,  pthread_createpthread_join,并声明了一个pthread_t型的变量。   ...在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_createpthread_joinpthread_exit。...属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数须在pthread_create函数之前调用。...函数pthread_once声明一个初始化函数,第一次调用pthread_once时它执行这个函数,以后的调用将被它忽略。   在下面的例子,我们创建一个键,并将它某个数据相关联。.../n"); pthread_join(id,NULL); return (0); }   这样,在不同的线程调用函数createMyWin,都可以得到在线程内部均可见的窗口变量,这个变量通过函数pthread_getspecific

    2.6K42

    Linux线程-概念控制

    而线程的进程的控制块基本是类似实现的,因此Linux直接复用了进程控制块,所以Linux的所有执行流都叫做轻量级进程 在Linux中都没有真正意义的线程,所以也就没有真正意义上的线程相关的系统调用...,但是Linux提供了轻量级进程相关的库接口,例如vfork函数原生线程库pthread 2、vfork函数/pthread线程库 vfork函数原型: pid_t vfork(void); 注意...,因时间分配上的细微偏差或者因共享了;不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺保护的 缺乏访问控制:进程是访问控制的基本粒度,在一个线程调用某些OS函数会对整个进程造成影响...,线程启动后要执行的函数,该函数返回值为void *,参数为void *;arg:传给线程启动函数的参数 返回值:成功返回0;失败返回错误码 注意: 主线程调用pthread_create...return 线程可以调用pthread_ exit终止自己 线程可以调用pthread_ cancel终止同一进程的另一个线程或者自己 注:在主线程使用return,以及在线程中使用

    1.2K20

    我有一个问题,用了多线程后,两个问题有了现在

    我在《对进程线程的一些总结》也有介绍,这里就不详述。 为什么要用多线程 很显然,多线程能够同时执行多个任务。...创建线程需要使用下面的函数: #include int pthread_create(pthread_t *thread, const pthread_attr_t *attr,...在《一个奇怪的链接问题》中提到,对于非glibc库的库函数,都需要显式链接对应的库。...但是转念一想,如果线程执行的时间超过一秒呢,难道就要sleep更长时间?而很多时候甚至根本不知道线程要执行多长时间,那怎么办呢?...线程终止 以下几种情况下,线程会终止 线程函数返回 调用pthread_exit,主线程调用无碍 调用pthread_cancel 调用exit,或者主线程退出,所有线程终止 注意 假如修改下面的代码:

    1K30
    领券