输出结果-新手:thread_create()线程创建和输出的问题

问题描述

新手: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;
}
}

时间: 2024-09-11 22:56:44

输出结果-新手:thread_create()线程创建和输出的问题的相关文章

Java多线程:用三个线程控制循环输出10次ABC

题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次. 解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程同步工作,也就是说要让三个线程轮流输出,直到10个ABC全部输出则结束线程.这里用一个Lock对象来控制三个线程的同步.用一个int型变量state标识由那个线程输出.   1 package com.thread; 2 3 import java.util.concurrent.locks.Lock

java 线程创建多线程详解_java

Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: Tread thread = new Thread(); thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码有两种方式:一种是创建 Thread 子类的一个实例并重写 run 方法,第二种是创建类的时候实现 Run

jdbc-数据在数据库中查询显示是中文,输出到页面转换为utf-8之后,输出为乱码,求解

问题描述 数据在数据库中查询显示是中文,输出到页面转换为utf-8之后,输出为乱码,求解 <%@page import="java.sql.ResultSet"%> <%@page import="java.sql.Statement"%> <%@page import="java.sql.DriverManager"%> <%@page import="java.sql.Connection&

c-double类型的数据printf输出,当值很大时的输出问题

问题描述 double类型的数据printf输出,当值很大时的输出问题 double a=11111*11111;doube b=111111111*111111111;double c=11个1*11个1; 三者输出如下:为什么会这样?同时,对于int型也有下面的结果:不是非常理解.希望能够得到解答,谢谢!! 解决方案 因为你直接写整数.那么它的乘法其实是整数乘法,最后转换为double而整数乘法溢出了. doube b=(double)111111111*(double)111111111;

线性表-【C#数据结构】为什么输出的是object[] Array ,而不是输出1 2 3 4

问题描述 [C#数据结构]为什么输出的是object[] Array ,而不是输出1 2 3 4 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test.SeqList { class SeqList { private int maxsize; //顺序表的最大容量 public int Maxsize { get { return maxsize;

字节流-如何用java输出每个字节的比特? 比如输出00101100

问题描述 如何用java输出每个字节的比特? 比如输出00101100 如题.在百度没找到想要的答案. 比如:对于一个中文字"你",为一个字符=两个字节=16个比特,我想输出这个16位的比特. 解决方案 先用 getbyte转换为 二进制字节http://blog.csdn.net/bk461409485/article/details/6579672 然后得到二进制http://blog.csdn.net/uikoo9/article/details/27980869 解决方案二:

c++ string 输出问题,为什么以下代码不输出?

问题描述 c++ string 输出问题,为什么以下代码不输出? #include #include #include using namespace std; int main() { string a[2]; string b="asdfg"; int i; int n=b.size(); for( i=0;i<b.size();i++) { a[0][i]=b.at(i); } a[0][i]=''; cout<<a[0]<<endl;//什么都不输

C# 多线程动态创建控件并访问由该线程创建的控件

问题描述 RT我在一个线程里面操作文件,有几个文件就创建几个线程.我想在UI上动态的创建几个进度条控件.怎么做?想了半天想不到啥...窝是菜鸟!求各路大神指点一二 解决方案 解决方案二:所有控件都只能有主线程创建,如果使用后台线程创建,时不时会有异常跳出.解决方案三:我用主线程创建,然后根据一定的规律来命名这些控件,然后在另外一个线程里面把处理好的数据和要使用的控件名用委托传回来,然后再在主线程里面找到这个控件并把数据添加到控件里面你觉得这样可以嘛?解决方案四:引用1楼CGabriel的回复:

JAVA线程创建底层流程

下面让我们来大概的分析下一个Java线程启动后,底层的调用细节. 环境:JDK:1.8            glibc:2-25            linux-kernel:2.6.0 1.0-大致的执行流程 一JAVA 层面: 当我们创建一个线程并执行start()方法后这个线程才会被创建和执行.java.lang.Thread.start()方法会调用本地方法start0(); 二 JVM 层面: 接下来start0()方法会调用JVM_StartThread()方法: 这是JVM_S