无法将不同的字符串传递给多个线程

时间:2017-05-26 01:08:57

标签: multithreading sockets thread-synchronization

我有一个生成多个线程的函数,每次都向它们传递一个不同的字符串,但似乎线程具有相同的字符串。字符串来自套接字。这是代码:

pthread_t *MirrorManager;

MirrorManager = malloc(sizeof(pthread_t)*th_size);
if( MirrorManager == NULL ) { perror("malloc"); exit(1); }
/* -------------------------------------- */

int th_num = 0; 

while( true )
{   
    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;
    }

    if( strcmp(buffer, "end") == 0 ) { break; }


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

    /* Create thread */
    strcpy(th_str, buffer);
    if( (err = pthread_create(&MirrorManager[th_num], NULL, thread_start, (void*) th_str)) == true )
    { show_error("pthread_create", err); }

    /* Take next thread */
    th_num++;
}

这里我生成两个线程。这两个线程具有相同的字符串,实际上这个字符串是从套接字中出来的最后一个字符串。为什么会发生这种情况,我该如何防止这种情况发生?请帮助我在这里停留几天。

1 个答案:

答案 0 :(得分:0)

您应该发布完整的代码。

根据您发布的内容,您的问题似乎是所有线程共享相同的参数th_str

pthread_create(&MirrorManager[th_num], NULL, thread_start, (void*) th_str))

相反,你应该为每个线程分配一个单独的th_str,因为你为每个线程传递一个指向它的指针,而不是字符串本身。

th_str = malloc(strlen(buffer));
strcpy(th_str, buffer);

然后确保让每个线程释放传递给它的指针。

PS:我强烈建议您对套接字中的所有数据使用strncmpstrncpy