当前位置: 首页 > 面试题库 >

Linux下AutoResetEvent的C ++等效项是什么?

缪兴腾
2023-03-14
问题内容

MSDN中AutoResetEvent的描述

我正在尝试将在C#中实现的线程池移植到Linux下的C ++。我不知道应该使用哪些行为与“ AutoResetEvent”类似的函数。


问题答案:

AutoResetEvent最类似于二进制信号量。人们说“条件变量”本身并没有错,但是条件变量用于类似的情况,而不是类似的对象。您可以在条件变量之上实现一个(未命名的)AutoResetEvent:

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

class AutoResetEvent
{
  public:
  explicit AutoResetEvent(bool initial = false);

  ~AutoResetEvent();
  void Set();
  void Reset();

  bool WaitOne();

  private:
  AutoResetEvent(const AutoResetEvent&);
  AutoResetEvent& operator=(const AutoResetEvent&); // non-copyable
  bool flag_;
  pthread_mutex_t protect_;
  pthread_cond_t signal_;
};

AutoResetEvent::AutoResetEvent(bool initial)
: flag_(initial)
{
  pthread_mutex_init(&protect_, NULL);
  pthread_cond_init(&signal_, NULL);
}

void AutoResetEvent::Set()
{
  pthread_mutex_lock(&protect_);
  flag_ = true;
  pthread_mutex_unlock(&protect_);
  pthread_cond_signal(&signal_);
}

void AutoResetEvent::Reset()
{
  pthread_mutex_lock(&protect_);
  flag_ = false;
  pthread_mutex_unlock(&protect_);
}

bool AutoResetEvent::WaitOne()
{
  pthread_mutex_lock(&protect_);
  while( !flag_ ) // prevent spurious wakeups from doing harm
    pthread_cond_wait(&signal_, &protect_);
  flag_ = false; // waiting resets the flag
  pthread_mutex_unlock(&protect_);
  return true;
}

AutoResetEvent::~AutoResetEvent()
{
  pthread_mutex_destroy(&protect_);
  pthread_cond_destroy(&signal_);
}


AutoResetEvent event;

void *otherthread(void *)
{
  event.WaitOne();
  printf("Hello from other thread!\n");
  return NULL;
}


int main()
{
  pthread_t h;
  pthread_create(&h, NULL, &otherthread, NULL);
  printf("Hello from the first thread\n");
  event.Set();

  pthread_join(h, NULL);
  return 0;
}

但是,如果您需要命名的自动重置事件,则可能需要查看信号量,并且可能很难翻译代码。无论哪种方式,我都会仔细查看平台上pthread的文档,条件变量和自动重置事件并不相同,并且行为也不相同。



 类似资料:
  • 问题内容: 我有以下代码,该代码将字符串作为输入,并转换为UNIX时间戳。我想在golang中做同样的事情,但我无法识别将在Go中提供等效于DateTimeOffset结构的结构或函数。 例如: 输入:635804753769100000 输出:1444878577 UTC对应时间:10/15/2015 3:09:36 AM +00:00 有人可以帮我解决这个问题,以获得上述结果。 谢谢 问题答案

  • 问题内容: Golang中C ++的等效功能是什么? 根据这里的问题,我可以得到以下声明: 但这将导入整个名称空间。现在我只想使用诸如定义之类的东西 Go中有与此等效的功能,因此我不必一直输入吗? 问题答案: 以下代码在可读性方面接近,但效率较低,因为编译器无法再内联函数调用。 而且,它具有输入名称的副作用,并到该文件的范围,这恐怕是C ++的没有做。

  • 问题内容: C ++等于什么? 问题答案: 在C 中没有与此等效的方法,尝试在C 中进行Java编程毫无意义。话虽如此,我将从尝试尽可能模仿陈述的赋值特征和精神的角度来探讨这一问题。我建议的每种方式都有缺点和局限性。前两个不是真正的惯用C ++,但是了解它们很重要,以了解后两个解决了哪些问题。 1. C样式的void指针。 让我从最基本,最有用的空指针开始: 可以从new运算符将任何东西分配给vo

  • 问题内容: 将Java转换为C#时,将语言环境转换为CultureInfo的正确方法是什么? 我知道在C#中,我们拥有当前线程的文化,并且在某些情况下为了写文件而希望提供一致性。但是Java Locale.ROOT和Locale.getDefault()是什么意思,它们通常如何映射到C#中的选项? 问题答案: 好吧,多亏了Andreas,我可以从javadoc中进行总结: 和 我只是希望该文档更容

  • 问题内容: LINQ的Java等效项是什么? 问题答案: 现在使用Java 8向我们介绍了Stream API,这在处理集合时是类似的事情,但与Linq不太一样。 如果它是您正在寻找的ORM,例如Entity Framework,那么您可以尝试Hibernate

  • 问题内容: 有Swift的等效项吗?在中,我们通常使用: 如何在Swift中实现相同目标?我发现了一个功能: 但是,它很长,根本不方便。 问题答案: 将在斯威夫特的世界同样存在。 的,和参数均标有 该装置的同时调用该函数我们可以忽略这些参数的关键字。在这种情况下,将使用其默认值。 这得出一个结论,该方法调用可以简化为: Swift 5- 没什么变化,仍然可以这样工作。