Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何停止并继续pthread?_C_Multithreading_Pthreads - Fatal编程技术网

C 如何停止并继续pthread?

C 如何停止并继续pthread?,c,multithreading,pthreads,C,Multithreading,Pthreads,我用C语言编写代码(实际上是用OOC语言编写的,然后编译成C语言) 如何指示线程在某个特定检查点等待,直到其他线程通知它继续 实际上,我在线程中使用了一个紧循环,并轮询了一个从主线程更改的变量,但我认为这不是很好的表现,对吗?除此之外,当我在线程中执行紧密循环时,我是否应该在循环中包含睡眠以避免在循环中消耗大量cpu能量?我认为这是一个很好的条件。该线程应该等待一个条件,而另一个线程应该发出条件信号,让该线程继续 您可以查找pthread_cond_init,这将导致其他函数看起来您正在查找它及

我用C语言编写代码(实际上是用OOC语言编写的,然后编译成C语言)

如何指示线程在某个特定检查点等待,直到其他线程通知它继续


实际上,我在线程中使用了一个紧循环,并轮询了一个从主线程更改的变量,但我认为这不是很好的表现,对吗?除此之外,当我在线程中执行紧密循环时,我是否应该在循环中包含睡眠以避免在循环中消耗大量cpu能量?

我认为这是一个很好的条件。该线程应该等待一个条件,而另一个线程应该发出条件信号,让该线程继续


您可以查找pthread_cond_init,这将导致其他函数

看起来您正在查找它及其相关函数

以下是来自的引用,并附有一个示例:

考虑由互斥mut保护的两个共享变量x和y,以及在x大于y时发出信号的条件变量cond

          int x,y;
          pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
          pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
等待x大于y的操作如下:

          pthread_mutex_lock(&mut);
          while (x <= y) {
                  pthread_cond_wait(&cond, &mut);
          }
          /* operate on x and y */
          pthread_mutex_unlock(&mut);

最后,它执行您要求的操作:调用
pthread\u cond\u wait(&cond)
的线程被阻塞,直到另一个线程(例如主线程)调用
pthread\u cond\u broadcast(&cond)
。在此期间,它只是处于阻塞状态,不占用CPU周期。

您应该研究适当的同步原语,如互斥体、条件变量和信号量。在本例中,听起来a是pthreads库中最合适的工具。

为了让您知道发生了什么,一个“紧循环”就像线程执行的任何其他代码一样消耗线程的CPU分配。唯一的区别是它一事无成。嗯,我想让核心温暖是件事。。。除非您关心上下文切换的成本,并且您确信等待时间将比线程的时间片(约1ms)要短得多,否则您可能永远都不想这样做。我不知道睡眠是否和收益率一样糟糕(AFAIK收益率将您的线程设置为要在优先级级别激活的线程列表的后面),但这两个线程至少都会受到上下文切换的惩罚。上下文切换是有代价的。上下文切换是线程的时间片结束时发生的情况。它可以结束,因为您以让步或睡眠结束了它,或者如果内核以抢占您的位置结束了它。阅读有关SMP和自旋锁的内容,了解更多有关上下文切换和紧循环适用时的情况

而且,当你睡觉的时候,你不知道什么时候会再次醒来。所以你不想睡觉的一个原因是你需要尽快完成一些事情。你可以等几毫秒再重新安排

其他人都给了您pthread_cond_wait解决方案,它需要通过互斥锁进行锁定,看起来简单明了。性能可能足以满足您的需要,但与使用signals()的解决方案相比,性能相对较慢。复杂性会悄悄地向你袭来

这里没有讨论的是,如果需要等待条件,为什么在测试之前锁定互斥锁。原因是这样的代码有一个缺陷:

      while (x <= y) {
              pthread_cond_wait(&cond, &mut);
      }
这可能意味着您在许多不同的地方添加了这些互斥锁,因此您的代码变得更加复杂和缓慢。挂起线程等待条件的可能性总是存在的。循环、测试、睡眠解决方案没有这些问题。因此,如果已知等待时间较短,则在循环中使用睡眠可能是一个很好的解决方案。特别是如果你可以在两次测试之间睡上一秒钟或更长时间。如果可以的话,就不用担心互斥体和条件。如果睡眠时间很短,比如1毫秒,而等待时间很长,比如几分钟或几小时,那么你最终会浪费一些资源,不停地醒来,然后继续睡觉。你必须做出判断

还要注意,有时内核会试图立即唤醒服务员线程,而其他时候会有延迟。如果线程太快唤醒,它将在互斥锁锁定时唤醒,并立即返回睡眠状态,直到互斥锁解锁。如果出现问题,请通过以下方式发出信号:

pthread_mutex_lock(&mut);
/* modify x and y */
if (x > y) {
    pthread_mutex_unlock(&mut);
    pthread_cond_broadcast(&cond);
} else
    pthread_mutex_unlock(&mut);

感谢user576875,他是我复制的代码示例。

请注意,您必须使用示例中所示的
while()
循环,因为您可能会被条件not true唤醒。
      pthread_mutex_lock(&mut);
      /* modify x and y */
      if (x > y) pthread_cond_broadcast(&cond);
      pthread_mutex_unlock(&mut);
pthread_mutex_lock(&mut);
/* modify x and y */
if (x > y) {
    pthread_mutex_unlock(&mut);
    pthread_cond_broadcast(&cond);
} else
    pthread_mutex_unlock(&mut);