【问题标题】:pthread can I get the original argument?pthread 我可以得到原始参数吗?
【发布时间】:2013-05-08 11:52:44
【问题描述】:

这是代码的sn-p:

pthread_create(&worker->thread, NULL, EagleWorker_begin, worker);

void* EagleWorker_begin(void *obj)
{
    EagleWorker *worker = (EagleWorker*) obj;
}

这很好用,但是有没有办法从当前线程中恢复 obj 而不必将它一直传递给每个函数?

【问题讨论】:

  • 不需要演员表。在 c 中,void* 可以毫无问题地转换为任何其他指向数据类型的指针。
  • @JensGustedt 取决于两个冲突的语言标签中的哪一个实际上适用。

标签: c++ c multithreading pthreads


【解决方案1】:

是的。您可以使用线程特定数据(线程本地存储)来制作线程范围的“全局变量”。线程代码可以像普通全局变量一样访问这些。但是每个线程都有自己的全局空间。

试试这个。

pthread_create(&worker->thread, NULL, EagleWorker_begin, worker);

__thread EagleWorker *worker;

void* EagleWorker_begin(void *obj)
{
    worker = (EagleWorker*) obj;

    foo();
}

void foo()
{
    worker->whatever = whatever;
}

您仍然需要确保为每个线程分配一个 EagleWorker 并将其传递给 pthread_create()。

【讨论】:

  • 这回答了这个问题——但我会避免使用 __thread。它将为线程的每个实例创建线程本地对象,无论它是否需要它。我发现在堆栈上分配更好。您可以将它全部包装在一个类中,并且在创建线程后永远不必担心它。
猜你喜欢
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 2017-04-22
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多