实现和测试thread_create函数

时间:2016-12-01 12:13:06

标签: c linux multithreading

我是C和Linux的新手,英语不是我的母语。提前抱歉。

我正在开发一个正在实现线程api的学校项目,我使用clone()创建了thread_create()函数。 问题是,当我打电话给thread_create(&tid1, NULL, (void *)Testcase1, 0);时, 它创建了一个新线程,但TestCase1还包含thread_create,它似乎不会创建另一个线程。让我用下面的代码解释一下:

int foo(void* arg){
    printf("Hii");
    return 0;
}
int     thread_create(thread_t *thread, thread_attr_t *attr, void *(*start_routine) (void *), void *arg)
{
    void* stack;

    stack= malloc( STACK_SIZE );
    pid_t pid;

    if( stack==0)
    {
        perror( "malloc : could not allocate stack" );
        exit( 1 );
    }
    pid = clone( &foo ,( char* )stack+STACK_SIZE,SIGCHLD|CLONE_VM|CLONE_SIGHAND|CLONE_FS|CLONE_FILES,0 );
    if(pid == -1)
    {
        perror("clone");
        exit(2);
    }
    kill(pid, SIGSTOP);

    Thread* newTCB = (Thread*)malloc(sizeof(Thread));
    newTCB->stackSize = malloc(STACK_SIZE);
    newTCB->pid = pid;
    newTCB->status = THREAD_STATUS_READY;

    rEnqueue(newTCB);
    rPrintqueue();

    free(stack);
    printf("Child thread returned and stack freed.\n");
    return 0;
}

这是我的测试代码:

    thread_create(&tid1, NULL, (void*)TestCase1, 0);

下面的TestCase1():

int Tc1ThreadProc(int param)
{
    int tid = 0;
    int count = 0;

    tid = thread_self();

    count = 3;
    while (count > 0)
    {
        /* sleep for 1 seconds */
        sleep(2);
        printf("Tc1ThreadProc: my thread id (%d), arg is (%d)\n", tid, param);
        count--;
    }
}
void TestCase1(void)
{
    thread_t tid[TOTAL_THREAD_NUM];

    thread_create(&tid[0], NULL, (void*)Tc1ThreadProc, (int*)1);
    thread_create(&tid[1], NULL, (void*)Tc1ThreadProc, (int*)2);
    thread_create(&tid[2], NULL, (void*)Tc1ThreadProc, (int*)3);

    while(1){}

    return ;
}

它应该打印"Tc1ThreadProc: my thread id (%d), arg is (%d)\n" 3次,但它只打印"Hii",这是因为调用了foo()。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您将指向函数“TestCase1”的指针作为“thread_create”的参数传递,但在“thread_create”中您根本不使用它:

thread_create(&tid1, NULL, (void*)TestCase1, 0);

您只使用指向“foo”函数的指针调用“clone”系统调用。 从“thread_create”里面你的“TestCase1”指针被命名为“start_routine”,所以你需要调用类似的“clone”系统调用,而是指向“foo”的指针,你应该将指针传递给“TestCase1”。这样的事情:

pid = clone( start_routine, (char*) stack + STACK_SIZE, SIGCHLD | CLONE_VM | CLONE_SIGHAND | CLONE_FS | CLONE_FILES, 0);