线程每次都没有命中线程函数

时间:2015-11-30 02:37:07

标签: c pthreads

我正在尝试创建一个包含多个文件的程序,将它们全部附加到一个大文件中。每个附加必须由一个单独的线程完成。

/*
This program creates appends several files together
*/

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


pthread_t *tids;

void *threadout(void *num);


int main(int argc, char *argv[])
{

    int numOfFiles = atoi(argv[2]);
    int error;
    int index;

    sem_t sem;

    //Used for output file
    int outFile;

    //Checking to make sure there is the correct number of arguments
    if (argc != 4)
    {
        printf("%s \n", "Wrong number of arguments, exiting program.");
        return 1;
    }

    //checking to make sure there are at least two files to append
    if (numOfFiles < 2)
    {
        printf("%s \n", "Cannot append 1 file or less.");
        return 1;
    }

    //opening/creating file
    outFile = open(argv[3], O_WRONLY | O_CREAT, S_IRUSR);

    ///****************** Allocate space for thread ids ******************/

    tids = (pthread_t *)calloc(numOfFiles, sizeof(pthread_t));
    if (tids == NULL)
    {
        perror("Failed to allocate memory for thread IDs");
        return 1;
    }
    if (sem_init(&sem, 0, 1) == -1)
    {
        perror("Failed to initialize semaphore");
        return 1;
    }

    /****************** Create threads *********************************/

    for (index = 0; index < numOfFiles; index++)
    {
        if (error = pthread_create(tids + index, NULL, threadout, &index))
        {
            fprintf(stderr, "Failed to create thread:%s\n", strerror(error));
            return 1;
        }
    }

    return 0;
}

void * threadout(void *num)
{
    printf("Hello");
    return NULL;
}

在程序的底部附近,我实际创建了线程。线程应该做的第一件事是点击“threadout”函数。然而,我可以获得任何打印的唯一方法是,如果我说要创建大量的线程。因此,如果我告诉我的程序创建5000个线程,将打印“Hello”。不过5000次。如果我要求它创建10个线程,则不打印任何内容。当我调用“threadout”时,我做错了吗?感谢

1 个答案:

答案 0 :(得分:3)

Returning from main causes your entire program to exit,即使其他线程正在运行。

启动所有线程后,main函数退出。如果您开始使用大量线程,则会留下足够的时间来打印第一个线程。如果你开始使用几个线程,它会在第一个线程打印之前返回。

您可能希望使用pthread_join(每个线程调用一次)来等待所有线程终止。