Pthread函数从C开始

时间:2014-05-02 18:48:52

标签: c linux process operating-system pthreads

我在进程,线程,信号量,ipc等方面都是新手(Linux上的操作系统操作很快)......我的问题是我编译了我的代码而它只是陷入了如此有趣的地步。流程被执行,但他们无法进入他们的线程'功能。之后,程序直接结束而不做任何事情。我真的无法弄清楚问题是在这里还是一切都有问题。我不知道。

#define _GNU_SOURCE
#include <sys/types.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>


void * function1(void *ptr)
{
    printf("Function 1\n");   //!Test prints
    printf("Index is %d",*((int *)ptr));
    sleep(1);
    pthread_exit(NULL);
}

void * function2(void *ptr)
{
    printf("Function 2\n");   //!Test prints
    printf("Index is %d",*((int *)ptr));
    sleep(2);
    pthread_exit(NULL);
}

int main(){
    //...
    int *index;
    int i;
    pid_t f;
    int number_of_process=5;
    pthread_t thread1, thread2;
    //...

    for(i=0; i<number_of_process; i++)
    {
        f=fork();
        if(f==-1)
        {
         printf("Fork Error!!\n");
         exit(1);
        }
        if(f==0)          //To block child processes re-enter
        {
         *index = i;  //I store index number for each process here. I'll need them in the thread functions
         break;
        }
    }

    /*******************PARENT PROCESS********************/
    if(f!=0){
        // wait for all children to exit
        while (f = waitpid (-1, NULL, 0)){
            if (errno == ECHILD)
            break;
        }
        exit(0);
    }

    /*******************CHILD PROCESS*********************/
    else{
        pthread_create(&thread1,NULL,function1,(void *)index);
        pthread_create(&thread2,NULL,function2,(void *)index);
    }
}

1 个答案:

答案 0 :(得分:3)

  

执行进程,但无法进入其线程的功能。   之后,程序直接结束而不做任何事情。

那是因为主线程(即fork()创建的子进程)不等待线程完成执行。所以它给你的印象是程序退出而不调用所有的pthread函数。

创建线程后使用pthread_join()

...
pthread_create(&thread1,NULL,function1,(void *)index);
pthread_create(&thread2,NULL,function2,(void *)index);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
...

由于线程打印而没有任何同步,输出可能会交错。