【问题标题】:Error at pthread_joinpthread_join 错误
【发布时间】:2014-11-06 23:06:11
【问题描述】:

我的程序需要创建一些线程,但我被困在 pthread_join,因为它总是进入错误情况,因为返回(安全)是 3,而不是 0,我认为这是正确的数字以防万一一切顺利。

编辑:为了更好地解释我自己,错误是代码正在进入错误处理区域,而它不应该进入,这意味着我收到“错误等待:成功”消息。

int main() {    

  pthread_t tids[NUM_THREADS];
  int a, i, resultado, safe ;
  char *f ;

  f = (char *)malloc(sizeof(SIZEFICHEIRO));
  a = randomnum(4);
  f = pickfile(a, f);

  for ( i=0; i<NUM_THREADS ; i++ )
  {
    safe = pthread_create( &tids[i] , NULL , (void *)verificador , (void *) f) ;
    if ( safe != 0 )
        perror ("Error creating threads");
  }

  for ( i=0; i<NUM_THREADS ; i++ )
  {
    safe = pthread_join( tids[i], (void **)&resultado ) ;
    if ( safe != 0 )     // Error here
        perror ("Error waiting");

    printf("Result(0:Works ; -1:error) =  %d\n", resultado);
  }

}

【问题讨论】:

  • 您正在打印的 error 是什么?它不会出现在您的代码中的其他任何地方。代码究竟输出了什么?您是否看到“错误等待”?
  • 它说:“错误等待:成功”,这意味着它正在进入错误处理区域,而它不应该这样做。

标签: c multithreading pthread-join


【解决方案1】:
safe = pthread_join( tids[i], (void **)&resultado ) ;
printf("%d", error );
if ( safe != 0 )     // Error here
    perror ("Error waiting");

如果pthread_join 将错误隐藏在errno 中,就像大多数调用一样,问题将是您对printf 的调用可以更改pthread_join 隐藏的错误代码。如果您要调用perror 来打印错误,则需要在生成错误的函数返回后立即调用它。

但是,pthread_join 不会将错误隐藏在errno 中,它会返回错误。所以调用perror 是行不通的。你可以这样做:

if ( safe != 0 )     // Error here
{
    errno = safe;
    perror ("Error waiting");
}

if ( safe != 0 )
    printf ("Error waiting: %s\n", strerror (safe));

【讨论】:

  • 这:if ( safe != 0 ) { errno = safe; perror ("Error waiting"); } 失败。这:`安全= errno; if (safe != 0) { perror ("错误等待"); } ` 工作。但是我一直在阅读,如果一切正常,pthread_create 和 pthread_join 都应该返回一个 int = 0 。这意味着仍有错误发生。
  • @TJacob 我从来没有建议过safe = errno,这没有任何意义。说“失败”是 100% 没用的。它准确地是如何失败的?
  • pthread_create 工作正常,安全返回零。在上述情况下,我评论说它有效,我没有收到错误,所以重要的是,工作。但我仍在阅读 pthread_join 也应该返回零。
  • 对,我告诉过你如何解决它。在 pthread_createpthread_join 情况下,您有相同的错误。你试过我的建议了吗?如果是这样,当你尝试它时发生了什么?
  • 与您的解决方案完全一样。这就是我得到的:“错误等待:成功结果(0:Works;-1:错误)= 0错误等待:成功结果(0:作品;-1:错误)= 0错误等待:没有这样的过程结果(0 :Works ; -1:error) = 0 错误等待:没有这样的过程 Result(0:Works ; -1:error) = 0 错误等待:没有这样的过程 结果(0:Works ; -1:error) = 0 错误等待: 没有这样的过程 Result(0:Works ; -1:error) = 0 "
【解决方案2】:

测试了这段代码:

int main() 

{   

  pthread_t tids[NUM_THREADS];
  int a, i, resultado, safe ;
  char *f ;

  f = (char *)malloc(sizeof(SIZEFICHEIRO));
  a = randomnum(4);
  f = pickfile(a, f);

  for ( i=0; i<NUM_THREADS ; i++ )
  {
    safe = pthread_create( &tids[i] , NULL , (void *)verificador , (void *) f) ;
    if ( safe != 0 )
        perror ("Error creating threads");
  }

  for ( i=0; i<NUM_THREADS ; i++ )
  {
    safe = pthread_join( tids[i], (void **)&resultado ) ;
    if ( error != 0 )
        errno = safe;
        perror ("Error waiting");

    printf("Result(0:Works ; -1:error) =  %d\n", resultado);
  }
}

结果是:

Error waiting: Success
Result(0:Works ; -1:error) = 0
Error waiting: Success
Result(0:Works ; -1:error) = 0
Error waiting: No such process
Result(0:Works ; -1:error) = 0
Error waiting: No such process
Result(0:Works ; -1:error) = 0
Error waiting: No such process
Result(0:Works ; -1:error) = 0
Error waiting: No such process
Result(0:Works ; -1:error) = 0

【讨论】:

  • 你把他们两个都弄坏了!在第一个中,您仍然调用perror,即使没有设置errno。在第二个中,您省略了大括号,因此 perror 行无论如何都会运行。
猜你喜欢
  • 2018-11-06
  • 2015-05-02
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多