所以我希望有3个线程都增加一个全局整数。我认为当创建一个线程时,它是一个fork的simulair,main将继续执行与新创建的线程同时的代码。但事实并非如此,因为在第一个线程完成后,第二个和第三个线程永远不会被创建。
void * say_it( void * )
{
int count = 0;
while(BUFFER < 24)
{
//LOCK
if (pthread_mutex_lock(&output_lock) != 0)
{
perror("Could not lock output: ");
exit(-1);
}
//print message
cout << "TID: " << pthread_self() << " PID: " << "WORK IN PROGRESS " << "Buffer: " << BUFFER << endl;
BUFFER++;
//UNLOCK
if (pthread_mutex_unlock(&output_lock) != 0)
{
perror("Could not unlock output: ");
exit(-1);
}
count++;
}
//print final message
cout << "TID: " << pthread_self() << " worked on the buffer " << count << " times" << endl;
}
int main(int argc, char *argv[])
{
int num_threads = 3;
pthread_t *thread_ids;
void *p_status;
//Use unbuffered output on stdout
setvbuf(stdout, (char *) NULL, _IONBF, 0);
//Set up an output lock so that threads wait their turn to speak.
if (pthread_mutex_init(&output_lock, NULL)!=0)
{
perror("Could not create mutex for output: ");
return 1;
}
//Create 3 THREADS
thread_ids = new pthread_t[num_threads];
// generate threads
for (int i = 0; i < num_threads; i++)
{
int *arg = new int;
*arg = i;
if( pthread_create(&thread_ids[i],NULL,say_it,NULL) > 0)
{
perror("creating thread:");
return 2;
}
if (pthread_join(thread_ids[i], &p_status) != 0)
{
perror("trouble joining thread: ");
return 3;
}
}
return 0;
}
我还尝试将睡眠(1)置于该计划的某些方面,但没有成功。
任何人都可以向我解释这个吗? 谢谢!
答案 0 :(得分:1)
当你致电pthread_join
时,main会阻塞,直到该线程结束。在线程上调用pthread_join
之前,您需要创建所有线程。
旁注:您在pthread_create
的评论后再次致电// join threads and print their return values
。这一切都需要删除。
答案 1 :(得分:1)
在循环中,您创建一个线程然后与它连接,因此在第一个线程完成之前不会创建下一个线程。你这里没有并发性。
10的第二个循环看起来很明显,因为你只为3个线程id分配了空间,但是在这里你创建了10个线程。
答案 2 :(得分:0)
您正在创建线程并等待线程完成。将连接代码移出for循环,如下所示。
for (int i = 0; i < num_threads; i++)
{
int *arg = new int;
*arg = i;
if( pthread_create(&thread_ids[i],NULL,say_it,NULL) > 0)
{
perror("creating thread:");
return 2;
}
}
for (int i = 0; i < num_threads; i++)
{
if (pthread_join(thread_ids[i], &p_status) != 0)
{
perror("trouble joining thread: ");
return 3;
}
}