pthread_mutex_lock仅适用于睡眠

时间:2017-05-29 21:37:01

标签: c multithreading mutex

我在pthread_create中传递了一个包含char *的结构,我用互斥锁锁定主线程和线程,所以我可以保护这个字符串,因为当创建第二个线程时,字符串会改变,第一个线程将使用第二个线程字符串而不是第一个。这是代码:

的main.c

while( th_num < th_size )
{   
    pthread_mutex_lock(&lock);

    received = 0;

    /* Read the desired readable size */
    if( read(newsock, &size, sizeof(size)) < 0 ) 
    { perror("Read"); exit(1); }

    /* Read all data */
    while( received < size )
    {
        if( (nread = read(newsock, buffer + received, size - received)) < 0 )
        { perror("Read"); exit(1); }

        received += nread;
    }

    printf("Received string: %s\n",buffer);


    Q->receiver = (char*) malloc(sizeof(char)*strlen(buffer)+1);
    strncpy(Q->receiver, buffer, strlen(buffer)+1);

    if( (err = pthread_create(&thread_server[th_num], NULL, thread_start, (void*) Q)) == true )
    { show_error("pthread_create", err); }
    /* -------------------------------------------------- */


    th_num++;

    pthread_mutex_unlock(&lock);
    usleep(500);
}

pthread_server.c

pthread_mutex_lock(&lock);
/*
do some stuff here
*/
pthread_mutex_unlock(&lock);

该程序运行正常,但问题是它只有在我放入睡眠(500)时才有效。我的猜测是,线程无法及时锁定互斥锁,因此需要睡眠才能正确执行此操作。没有usleep()会有办法吗?

1 个答案:

答案 0 :(得分:0)

假设我不明白为什么你需要在代码的互斥部分中调用pthread_create();,你的问题是:

你使用线程,但程序的流程接近顺序,因为代码的互斥部分很大。

让X成为程序中的通用线程。

当X线程完成时没有usleep(500);它会释放带有pthread_mutex_unlock(&lock);的互斥锁,但之后线程X重新获取锁定,因此没有其他人可以在代码的互斥部分中访问。

现在我不知道你的共享数据是什么,所以我只能建议你:

1)减少代码的互斥部分,仅在访问共享数据时使用它;

2)重新思考你的程序结构。