gpt4 book ai didi

c - 我的 pthread 没有调度。在 C 中

转载 作者:太空宇宙 更新时间:2023-11-04 01:04:35 24 4
gpt4 key购买 nike

我有一个程序接受参数,然后为多个 pthread_t(pthread 数组)动态分配空间,然后 pthread_create() 加载函数。问题是我的第一个线程并没有停止运行。在我的第一个线程完成整个过程之前,我的第二个线程甚至不会创建。我该如何解决这个问题?这是一个简单的代码来演示我的问题

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

pthread_t *ptr;
int num;

void* func(int id)
{
while(1)
printf("%d\n", id);
}

int main(int argc, char *argv[])
{
int i;

num = atoi(argv[1]); //assuming arguments are always valid

ptr = malloc(sizeof(pthread_t)*num);

for(i = 0; i < num; i++)
pthread_create(&ptr[i], NULL, func(i), NULL);

//free allocated space

return 0;
}

我的问题是 0 总是被打印出来,我从来没有看到 1。我的猜测是 ptr[1] 从来没有机会初始化自己,所以线程不存在。所以它不会得到它的 cpu 份额。程序本身不是有 1 个主线程吗?经过一些处理时间后,cpu 应该切换回主线程,然后 pthread_create 第二个线程。它永远不会发生。我只是想知道为什么。

我是 C 的新手,这是我第一次做 pthread。所以请给我适合我水平的建议。谢谢。

感谢所有伟大的建议,我已将我的代码更改为:

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

int num;
pthread_t *ptr;

void* func(void* id)
{
int *c;
c = (int*)id;
while(1)
if(c)
printf("%d\n", *c);
}

int main(int argc, char *argv[])
{
int i;

num = atoi(argv[1]);

ptr = malloc(sizeof(pthread_t)*num);
for(i = 0; i < num; i++)
pthread_create(&ptr[i], NULL, func, (void*)&i);

for(i = 0; i < num; i++)
pthread_join(ptr[i], NULL);

return 0;
}

但是,我仍然只看到 0。我现在创建线程了吗?

最佳答案

只是为了指出您的代码实际发生了什么 - 按预期工作,pthread_create()需要一个指向应在新线程中运行的函数的指针

你正在做的是:

pthread_create(&ptr[i], NULL, func(i), NULL);

不是将 func 作为指针传递,而是直接调用该函数。由于在调用 pthread_create() 之前需要评估 pthread_create() 的参数,因此运行 func() - 但在您的主线程,甚至在开始一个新线程之前。由于 func() 包含一个无限循环,因此除了 func(0) 的输出之外,您永远不会看到任何东西。

要正确调用 pthread_create(),请使用指向它的函数指针,只需省略 () 部分即可轻松获得它(如对于其他一些答案,您可以在 pthread_create() 的第四个参数中将您的 i 参数传递给 func()。即:

pthread_create(&ptr[i], NULL, func, (void*)i);

此外,其他需要注意的事项(如其他答案所指出的),您应该更改 func() 以采用 void* 参数,并确保您的主线程在生成线程后继续运行 - 通过进入各种无限循环,或通过调用 pthread_join()等待生成的线程终止

关于c - 我的 pthread 没有调度。在 C 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26751548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com