永发信息网

c语言多线程

答案:1  悬赏:50  手机版
解决时间 2021-03-05 22:34
#include

#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 %d\n", 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 %d\n", t);

rc = pthread_create(&thread[t], NULL, PrintHello, &t);

if (rc)

{

printf("ERROR; return code is %d\n", rc);

return EXIT_FAILURE;

}

}

sleep(5);

for( t = 0; t < NUM_THREADS; t++ )

pthread_join(thread[t], NULL);

return EXIT_SUCCESS;

}
这段程序为什么都是输出Hello from thread 8,而不是0-7
最佳答案
因为您传入的是t的地址:rc = pthread_create(&thread[t], NULL, PrintHello, &t);

所以在PrintHello函数中thread_arg = (int)(*((int*)args));读取时会读取到t的最新值,即8.
这是因为主线程一直在执行,for( t = 0; t < NUM_THREADS; t++ )很快执行完,跳出循环t的值为8,而在PrintHello中sleep(1);肯定会读取到t的最新值8.
直接传t的值即可,如下:
#include
#include 
#include 
#include  // 加入这个头文件
#include 
#include 

#define    NUM_THREADS     8

void *PrintHello(void *args)
{
          int thread_arg;
          sleep(1);
          thread_arg = (int)(uintptr_t)args; //这样读取传来的t的值
          printf("Hello from thread %d\n", 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 %d\n", t);
            rc = pthread_create(&thread[t], NULL, PrintHello, (void *)(uintptr_t)t); // 这样传t的值
            if (rc)
            {
                printf("ERROR; return code is %d\n", rc);
                return EXIT_FAILURE;
            }
        }
        sleep(5);
        for( t = 0; t < NUM_THREADS; t++ )
            pthread_join(thread[t], NULL);
        return EXIT_SUCCESS;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
excel输入格式改不动 ,输入的10/17会自动跳
wow隐藏的虫语者箱子怎么看不见 坐标一览
普陀太平鸟风尚男装地址有知道的么?有点事想
【周到】周到如砥成语的意思
蝎蝎养死了,想做成标本,本来想做干的,现在
如何做到安全使用电热水器
Macbook pro原先装了盗版office,现在买了正版
中外动漫的对比
【我家养的金鱼的粪便如何清理啊?不换水的情
意中缘珠宝地址在哪,我要去那里办事
我的世界怎么让羊生小羊 MC养羊的技巧
跪求。大家帮看下我做的阴超结果
步步高朗文6988这款机器和7980哪个好啊? 698
被检查出“铬”超标的医药企业有哪些?尽量详
电动车 在下坡时 可以关掉电源 直接用刹车减
推荐资讯
闽南超市地址在什么地方,想过去办事
开车从重庆到合肥全程高速需要多少油钱 谢谢
三菱欧蓝德开门顶灯不亮
老实说我女友有三个姐姐一个哥哥如果跟她结婚
剪彩用的大红花是怎么做的啊
拍产品用什么手机软件
张帆一个大学生,为什么会信奉邪教??走上这
九味山房猪脚地址在哪,我要去那里办事
若x的绝对值等于x,则x取值范围是?
今天收到了好评 但是看店铺信誉度还是显示 尚
盗墓笔记谁先在新月饭店点的天灯?
有意思的数学几何问题
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?