C 如何知道哪个线程正在执行函数?
所以我有一个电梯程序的缩小版本,它在c中使用pthreads。每个线程都是调用函数请求的单个提升。我不知道如何知道哪个提升1、2或3线程正在使用函数请求。在请求函数中,我需要打印当时使用它的线程。对不起,如果我的解释不完全合理的话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
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;