我在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()会有办法吗?
答案 0 :(得分:0)
假设我不明白为什么你需要在代码的互斥部分中调用pthread_create();
,你的问题是:
你使用线程,但程序的流程接近顺序,因为代码的互斥部分很大。
让X成为程序中的通用线程。
当X线程完成时没有usleep(500);
它会释放带有pthread_mutex_unlock(&lock);
的互斥锁,但之后线程X重新获取锁定,因此没有其他人可以在代码的互斥部分中访问。
现在我不知道你的共享数据是什么,所以我只能建议你:
1)减少代码的互斥部分,仅在访问共享数据时使用它;
2)重新思考你的程序结构。