问题描述
- 新手:thread_create()线程创建和输出的问题
-
#include
#include
#include
#include#define NUM_THREADS 8
void PrintHello(void *args)
{
int thread_arg;
sleep(1);
thread_arg = (int)(((int*)args));
printf("Hello from thread %dn", thread_arg);
return NULL;
}int main(void)
{
int rc,t;
pthread_t thread[NUM_THREADS];for( t = 0; t < NUM_THREADS; t++) { printf("Creating thread %dn", t); rc = pthread_create(&thread[t], NULL, PrintHello, &t); if (rc) { printf("ERROR; return code is %dn", rc); return EXIT_FAILURE; } } sleep(5); for( t = 0; t < NUM_THREADS; t++) pthread_join(thread[t], NULL); return EXIT_SUCCESS;
}
Creating thread 0
Creating thread 1
Creating thread 2
Creating thread 3
Creating thread 4
Creating thread 5
Creating thread 6
Creating thread 7
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8这个输出结果搞不明白,不是应该是下面这样吗
Creating thread 0
Creating thread 1
Creating thread 2
Creating thread 3
Creating thread 4
Creating thread 5
Creating thread 6
Creating thread 7
Hello from thread 0
Hello from thread 1
Hello from thread 2
Hello from thread 3
Hello from thread 4
Hello from thread 5
Hello from thread 6
Hello from thread 7搞不懂为什么。。。
解决方案
刚刚我自己本地测试了一下。
sleep(1);
thread_arg = (int)(((int*)args));
改为
int thread_arg = -1;
thread_arg = *(int *)arg;
sleep(1);
可以满足你的需求
解决方案二:
这样改:
rc = pthread_create(&thread[t], NULL, PrintHello, &t);
改成
int i = t;
rc = pthread_create(&thread[t], NULL, PrintHello, &i);
解决方案三:
想想还是不妥,这样改吧:
for( t = 0; t < NUM_THREADS; t++)
{
printf("Creating thread %dn", t);
rc = pthread_create(&thread[t], NULL, PrintHello, &t);
if (rc)
{
printf("ERROR; return code is %dn", rc);
return EXIT_FAILURE;
}
}
改成
int i[8];
for( t = 0; t < NUM_THREADS; t++)
{
printf("Creating thread %dn", t);
i[t]=t;
rc = pthread_create(&thread[t], NULL, PrintHello, &i[t]);
if (rc)
{
printf("ERROR; return code is %dn", rc);
return EXIT_FAILURE;
}
}
解决方案四:
你在线程里面一进去就睡眠了1秒,外面的循环早就结束了,传递进来的参数t,已经是8了,所以全部是8;
修改:
sleep(1);
thread_arg = (int)(((int*)args));
改为
thread_arg = (int)(((int*)args));
sleep(1);
先把传递的参数接受了,再去做想要做事情
解决方案五:
线程的简历不是阻塞的,也就是说,你的循环跑完了,线程才创建出来,也就是说,你虽然在t=0的时候已经创建了线程,但是此时还会进行一些线程的准备,线程准备的时间要比你for的时间慢就出现了那样的情况,再就是t最好是值传递
解决方案六:
线程的简历不是阻塞的,也就是说,你的循环跑完了,线程才创建出来,也就是说,你虽然在t=0的时候已经创建了线程,但是此时还会进行一些线程的准备,线程准备的时间要比你for的时间慢就出现了那样的情况,再就是t最好是值传递
解决方案七:
sleep(1);
thread_arg = (int)(((int*)args));
改为
thread_arg = (int)(((int*)args));
sleep(1);
解决方案八:
int i[8];
for( t = 0; t < NUM_THREADS; t++)
{
printf("Creating thread %dn", t);
i[t]=t;
rc = pthread_create(&thread[t], NULL, PrintHello, &i[t]);
if (rc)
{
printf("ERROR; return code is %dn", rc);
return EXIT_FAILURE;
}
}