Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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 如何知道哪个线程正在执行函数?_C_Pthreads - Fatal编程技术网

C 如何知道哪个线程正在执行函数?

C 如何知道哪个线程正在执行函数?,c,pthreads,C,Pthreads,所以我有一个电梯程序的缩小版本,它在c中使用pthreads。每个线程都是调用函数请求的单个提升。我不知道如何知道哪个提升1、2或3线程正在使用函数请求。在请求函数中,我需要打印当时使用它的线程。对不起,如果我的解释不完全合理的话 void* request(void* abc) { int ii; for(ii = 0; ii < 8; ii++) { sleep(1); printf("REQUEST FROM LIFT COM

所以我有一个电梯程序的缩小版本,它在c中使用pthreads。每个线程都是调用函数请求的单个提升。我不知道如何知道哪个提升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;
}

您可以通过多种方式实现这一点,最简单的方法是将一些有意义的值作为线程参数传递,以标识每个线程

下面是一个例子:

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;
}

最简单的解决方案是将NULL以外的内容作为pthread_create的最后一个参数传递,因为在您的示例中,该参数将作为void*abc传递给请求函数。编辑:花了几秒钟太长。。。Marco Bonelli已经发布了我的意思,thread_self将返回调用线程的pthread_t。一些代码假定pthread_t是一个整数,但这是不可移植的。请参阅。@CodingNoob24:因为您是一个编码noob:,请记住,您需要传递一个指向对象的指针,该对象的生命周期至少与线程的生命周期相同。这是一个很好的例子,但实际上,您可能会创建线程,而不会在事后立即连接它们,因此对这些ID进行malloc或使其成为静态是有意义的。另一种常见做法是将整数值强制转换为void*并像void*1、void*2一样直接传递它们,当然,我不是说这是一个特别好的做法,但这是很常见的&pthread_create调用的最后一个参数中的id1可能需要显式强制转换来丢弃常量,以避免编译器警告。@MarcoBonelli:这就是我写这篇文章的原因,但在实践中,您可能会创建线程,而不会在事后立即加入它们。我并不是说这是错误的,我已经投了赞成票,我只是给OP写了一个提示,因为我看到了一些关于由于这些错误而导致运行时错误的问题。@Groo我最初以为这是写给我的,对此表示抱歉。明白了。
// Outside main:
static const int id1 = 1, id2 = 2, id3 = 3;