pthread_join 和 pthread_mutex_lock 有啥区别?

     2023-02-22     86

关键词:

【中文标题】pthread_join 和 pthread_mutex_lock 有啥区别?【英文标题】:Whats the difference between pthread_join and pthread_mutex_lock?pthread_join 和 pthread_mutex_lock 有什么区别? 【发布时间】:2015-10-02 17:10:13 【问题描述】:

以下代码取自this site,它展示了如何使用互斥锁。它同时实现了 pthread_join 和 pthread_mutex_lock:

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

void *functionC();
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int  counter = 0;

main()

   int rc1, rc2;
   pthread_t thread1, thread2;

   /* Create independent threads each of which will execute functionC */

   if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )
   
      printf("Thread creation failed: %d\n", rc1);
   

   if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) )
   
      printf("Thread creation failed: %d\n", rc2);
   

   /* Wait till threads are complete before main continues. Unless we  */
   /* wait we run the risk of executing an exit which will terminate   */
   /* the process and all threads before the threads have completed.   */

   pthread_join( thread1, NULL);
   pthread_join( thread2, NULL); 

   exit(EXIT_SUCCESS);


void *functionC()

   pthread_mutex_lock( &mutex1 );
   counter++;
   printf("Counter value: %d\n",counter);
   pthread_mutex_unlock( &mutex1 );

我按原样运行了上面给出的代码,它产生了以下结果:

计数器值:1

计数器值:2

但在第二次运行中,我删除了“pthread_mutex_lock(&mutex1);”和“pthread_mutex_unlock(&mutex1);” .我编译并运行了代码,它再次产生了相同的结果。

现在让我感到困惑的是为什么在上面的代码中使用互斥锁,而没有它也可以完成同样的事情(使用 pthread_join)?如果 pthread_join 阻止另一个线程运行,直到第一个线程完成,那么我认为它已经阻止另一个线程访问计数器值。 pthread_mutex_lock 的目的是什么?

【问题讨论】:

【参考方案1】:

连接会阻止启动线程运行(从而终止进程),直到线程 1 和线程 2 完成。它不提供线程1 和线程2 之间的任何同步。互斥锁阻止 thread1 在 thread2 修改计数器时读取计数器,反之亦然。

如果没有互斥锁,最明显的问题是线程 1 和线程 2 完美同步运行。他们每个人都从计数器中读取零,每个人都加一,然后每个人都输出“计数器值:1”。

【讨论】:

但是它们永远不会完美同步运行,因为一个线程必须等到另一个线程完成 pthread_join...我已经测试过...即使线程数量较多,它们也不会遇到每个线程其他只需使用 pthread_join。是否有一些条件,即使调用了 pthread_join,线程也可以同时访问资源? @QandeelAbbasi 只有开始线程调用pthread_join。 thread1 和 thread2 都没有调用它。唯一等待线程完成的线程是起始线程。此外,两个线程甚至可以在调用 pthread_join 之前运行完成。 @DavidSchwartz,这里的“开始线程”是什么意思?是main函数吗? @Ac3_DeXt3R 起始线程是调用main函数的线程。 @DavidSchwartz,所以基本上它是我们运行可执行文件时的主要进程?

pthread_join和pthread_detach的用法

...互斥锁(mutex)和条件变量(conditionvariable)。 调用pthread_join()将阻塞自己,一直到要等待加入的线程运行结束。 可以用pthread_join()获取线程的返回值。&nbs 查看详情

pthread_join - 多个线程等待

】pthread_join-多个线程等待【英文标题】:pthread_join-multiplethreadswaiting【发布时间】:2009-01-1015:06:29【问题描述】:使用POSIX线程和C++,我有一个“插入操作”,一次只能安全地完成一个。如果我有多个线程等待使用pthread_join插入... 查看详情

调用 pthread_join() 两次时 glibc pthread_join 崩溃

】调用pthread_join()两次时glibcpthread_join崩溃【英文标题】:glibcpthread_joincrashwhencallpthread_join()twice【发布时间】:2017-08-1600:45:48【问题描述】:我使用POSIXpthread库编写了以下代码:#include<stdlib.h>#include<pthread.h>void*thread_functi... 查看详情

pthread_detach()与pthread_join的区别?

...即主线程与子线程分离,子线程结束后,资源自动回收。pthread_join()即是子线程合入主线程,主线程阻塞等待子线程结束,然后回收子线程资源。【转】在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached)。... 查看详情

c - 无法理解 pthread_join()

】c-无法理解pthread_join()【英文标题】:c-can\'tunderstandpthread_join()【发布时间】:2019-01-2215:04:37【问题描述】:我不知道我错在哪里,在运行代码到达它运行pthread_join()的位置后,许多pthread_join()返回值3而不是0。此外,打印@98765432... 查看详情

使用一个参数调用 pthread_join 会导致分段错误?

】使用一个参数调用pthread_join会导致分段错误?【英文标题】:Callingpthread_joinwithoneargumentcausesasegmentationfault?【发布时间】:2021-05-1102:06:00【问题描述】:如果我连续调用pthread_join(不使用其他函数)会导致分段错误。我可以通... 查看详情

pthread_join() 用于未知数量的线程

】pthread_join()用于未知数量的线程【英文标题】:pthread_join()forunknownnumberofthreads【发布时间】:2021-12-0502:05:00【问题描述】:main()中的poll()等待来自另一个应用程序的某种触发器,当有触发器时,执行pollHandler()。在pollHandler()中... 查看详情

pthread_join的介绍

参考技术A函数pthread_join用来等待一个线程的结束。头文件:#include&lt;pthread.h&gt;函数定义:intpthread_join(pthread_tthread,void**retval);描述:pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的... 查看详情

如何停止在共享库中实现的阻塞 pthread_join()

】如何停止在共享库中实现的阻塞pthread_join()【英文标题】:Howtostopablockingpthread_join()implementedinasharedlibrary【发布时间】:2019-01-1403:26:22【问题描述】:我的代码在程序退出之前从第三方库调用了一个函数。不幸的是,被调用的... 查看详情

等待 pthread_create 完成而不使用 pthread_join

】等待pthread_create完成而不使用pthread_join【英文标题】:Waitingforpthread_createtofinishwithoutusingpthread_join【发布时间】:2009-04-0812:25:11【问题描述】:我想暂停一个线程,直到另一个线程完成初始化而不使用pthread_join。我尝试使用连... 查看详情

为啥 pthread_join() 的第二个参数是一个**,一个指向指针的指针?

】为啥pthread_join()的第二个参数是一个**,一个指向指针的指针?【英文标题】:Whythesecondargumenttopthread_join()isa**,apointertoapointer?为什么pthread_join()的第二个参数是一个**,一个指向指针的指针?【发布时间】:2018-04-2315:27:20【问题... 查看详情

为啥 pthread_join 会出现此错误? [错误] 从 'void*' 到 'void**' 的无效转换 [-fpermissive]

】为啥pthread_join会出现此错误?[错误]从\\\'void*\\\'到\\\'void**\\\'的无效转换[-fpermissive]【英文标题】:Whythepthread_joinisgivingthiserror?[Error]invalidconversionfrom\'void*\'to\'void**\'[-fpermissive]为什么pthread_join会出现此错误?[错误]从\'void*\'到\'v 查看详情

c语言pthread_join()函数(代码片段)

man1pthread_joinPTHREAD_JOIN(3)LinuxProgrammer'sManualPTHREAD_JOIN(3)NAMEpthread_join-joinwithaterminatedthread //与终止的线程连接SYNOPSIS#include<pthread.h>intpthread_join(pthread_tthread,void**ret 查看详情

是否可以在没有 pthread_join() 的情况下使用 pthread?

】是否可以在没有pthread_join()的情况下使用pthread?【英文标题】:Isitpossibletousepthreadswithoutpthread_join()?【发布时间】:2011-06-2122:10:06【问题描述】:我最近在尝试将一些多线程功能添加到我的一些代码中以用于工作项目时注意到... 查看详情

c语言pthread_join()函数(代码片段)

man1pthread_joinPTHREAD_JOIN(3)LinuxProgrammer'sManualPTHREAD_JOIN(3)NAMEpthread_join-joinwithaterminatedthread //与终止的线程连接(调用者线程将阻塞,直到被join的线程返回)SYNOPSIS#include<pthread.h& 查看详情

对线程等待函数pthread_join二级指针参数分析

线程创建函数pthread_create的函数原型如下:intpthread_create(pthread_t*restrictthread,             constpthread_attr_t*restrictattr,    查看详情

pthread_join/__pthread_internal_find函数发生sigabrt的crash(android)

pthread_join等待一个线程结束才返回。他会先调用__pthread_internal_find函数查找这个线程是否存在,但在android26之后,__pthread_internal_find函数对找不到的线程会crash。https://stackoverflow.com/questions/46457800/android-oreo-8-0-native 查看详情

linux进程与线程二

intpthread_join(pthread_tthr,void**thr_return);pthread_join函数用于挂起当前线程,直至th指定的线程终止为止。如果另一个线程返回值不是NULL,则保存在thr_return地址中。一个线程所使用的内存资源在应用pthread_join调用之前不会被重新分配,... 查看详情