关闭动态创建的线程

时间:2017-10-23 00:39:05

标签: c linux multithreading

这适用于操作系统编程分配。我试图读取 n 数量的文件,使用线程搜索每个文件以查找特定字符的多次出现。

./mycount j new.txt some.txt here.txt hello.txt

我的测试代码的输出应该是:

argumentCount: 6
threadCount: 4
pthread_create() for thread 0 returns: 0
Thread 1
pthread_create() for thread 1 returns: 0
Thread 2
pthread_create() for thread 2 returns: 0
Thread 3
pthread_create() for thread 3 returns: 0
Thread 4

然而, mycount 的每次执行都不同,最后一个线程通常不执行/打印。无论是那个还是他们偶尔打印,串联等等。

我试图利用互斥锁来确保数据的完整性,但我不确定幕后真的发生了什么。

我如何确保每次都以相同的方式完成所有事情?最后一个线程总是返回0,但它有时不会执行我完全给出的函数。

代码:

//GLOBALS
int occurrences = 0;

//PROTOTYPES
void *scanFile( void *filePtr );

//Initialize space for mutex.
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

//Receive arguments from .exe call
void main ( int argumentCount, char *argumentVariables[] )
{
    //Exit if argumentCount is > 50.
    if (argumentCount > 50)
    {
        perror("Too many arguments. Enter less than 50.\n");
        exit(EXIT_FAILURE);
    }

    printf("argumentCount: %d \n", argumentCount);
    //Instantiate variables.
    //i - iterator
    //*newCommand - Used to hold string value of first command entered.
    //*newVector - Used to hold string of the rest of the commands. Is a vector.
    int i;
    char *searchCharacter;
    char *newVector[argumentCount];

    //Iterate through command line arguments and split them.
    for (i = 0; i < argumentCount; i++)
    {
        searchCharacter = argumentVariables[1];
        if (i < argumentCount - 1)
        {
            newVector[i] = argumentVariables[1 + i];
        }
        else
        {
            newVector[i] = NULL;
        }
    }

    //Exit if newest command is NULL.
    if (searchCharacter == NULL)
    {
        perror("No character entered!\n");
        exit(EXIT_FAILURE);
    }

    int threads = argumentCount - 2;
    printf("threadCount: %d \n", threads);
    pthread_t * thread = malloc(sizeof(pthread_t)*threads);

    for (int i = 0; i < threads; i++)
    {
        int ret;
        char *message = "Thread";
        ret = pthread_create(&thread[i], NULL, scanFile, (void*) message);
        if (ret != 0)
        {
            printf("Error - pthread_create() return code: %d\n", ret);
            exit(EXIT_FAILURE);
        }

        printf("pthread_create() for thread %d returns: %d\n", i, ret);
    }

    exit(EXIT_SUCCESS);
}

void *scanFile( void *filePtr )
{
    pthread_mutex_lock( &mutex );
    char *message;
    message = (char *) filePtr;
    occurrences += 1;
    printf("%s %d\n", message, occurrences);
    pthread_mutex_unlock( &mutex );
}

1 个答案:

答案 0 :(得分:0)

感谢user2864740和Ken Thomases找到解决方案。

添加了:

for (int j = 0; j < threads; j++)
{
    //Join the threads so all the data is good to go.
    pthread_join(thread[j], NULL);
}

校正:

for (int i = 0; i < threads; i++)
{
    request[i].file = argumentVariables[i + 2];
    request[i].character = searchCharacter;

    //Create the thread. Any output from the integer newThread is an error code.
    newThread = pthread_create(&thread[i], NULL, *scanFile, &request[i]);
    if (newThread != 0)
    {
        printf("Error - pthread_create() return code: %d\n", newThread);
        exit(EXIT_FAILURE);
    }
}

for (int j = 0; j < threads; j++)
{
    //Join the threads so all the data is good to go.
    pthread_join(thread[j], NULL);
}