【问题标题】:How to Know which Thread is executing a function?如何知道哪个线程正在执行一个函数?
【发布时间】:2020-04-24 14:14:17
【问题描述】:

所以我有一个电梯程序的缩小版本,它在 c 中使用 pthreads。每个线程都是调用函数request() 的单独电梯。我不确定如何知道哪个电梯(1、2 或 3)是线程正在使用函数请求。在请求函数中,我需要打印当时哪个线程使用了它。对不起,如果我的解释不完全有意义。

void* request(void* abc)
{ 
    int ii;
    for(ii = 0; ii < 8; ii++)
    {
        sleep(1);
        printf("REQUEST FROM LIFT COMPLETED\n");
    }
}
int main()
{
    pthread_t lift1;
    pthread_t lift2;
    pthread_t lift3;

    pthread_create(&lift1, NULL, request, NULL);
    pthread_create(&lift2, NULL, request, NULL);
    pthread_create(&lift3, NULL, request, NULL);

    pthread_join(lift1, NULL);
    pthread_join(lift1, NULL);
    pthread_join(lift1, NULL);

    return 0;
}

【问题讨论】:

  • 最简单的解决方案是传递除 NULL 以外的其他参数作为 pthread_create() 的最后一个参数,因为在您的示例中这将传递给请求函数(如 void* abc)。编辑:花费了几秒钟的时间...... Marco Bonelli 发布了我的意思
  • pthread_self() 将返回调用线程的pthread_t。一些代码假定pthread_t 是一个整数,但这不是可移植的。见How to print pthread_t

标签: c pthreads


【解决方案1】:

您可以通过多种方式做到这一点,最简单的一种是传递一些有意义的值作为线程参数来识别每个线程。

这是一个例子:

void *request(void *data)
{ 
    const int id = *(const int *)data;
    int ii;

    for(ii = 0; ii < 8; ii++)
    {
        sleep(1);
        printf("REQUEST FROM LIFT %d COMPLETED\n", id);
    }
}

int main()
{
    const int id1 = 1, id2 = 2, id3 = 3;
    pthread_t lift1;
    pthread_t lift2;
    pthread_t lift3;

    pthread_create(&lift1, NULL, request, (void *)&id1);
    pthread_create(&lift2, NULL, request, (void *)&id2);
    pthread_create(&lift3, NULL, request, (void *)&id3);

    pthread_join(lift1, NULL);
    pthread_join(lift2, NULL);
    pthread_join(lift3, NULL);

    return 0;
}

您还可以将这些 id 变量定义为 static 全局变量:

// Outside main:
static const int id1 = 1, id2 = 2, id3 = 3;

【讨论】:

  • @CodingNoob24:因为你是一个编码新手 :),请记住,你需要将一个指针传递给一个对象,该对象的生命周期至少与你的线程一样长。这是一个很好的例子,但在实践中,您可能会创建线程而不立即加入它们,因此malloc 这些 id 或将它们设为静态是有意义的。
  • 另一种常见的做法是将整数值转换为 void* 并像(void*)1(void*)2 等直接传递它们。当然我并不是说这是一个特别的 良好的做法,但它常见的
  • &amp;id1 在对pthread_create 的调用的最后一个参数中可能需要显式强制转换来丢弃常量以避免编译器警告。
  • @MarcoBonelli:这就是我写“但实际上你可能会创建你的线程而不立即加入它们”的原因。我并不是说这是不正确的(我已经投了赞成票),我只是给 OP 写了一个提示,因为我已经看到了几个关于由于这些错误而导致运行时错误的问题。
  • @Groo 我最初以为这是给我的,对此感到抱歉。明白了。
猜你喜欢
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2011-03-21
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多