简体   繁体   English

重新执行多线程代码后,为什么输出不一样?

[英]Why are not outputs the same after re-executing my multithreading code?

When I execute the following code, after every re-compile and re-execute, the answers(outputs) are not the same. 当我执行以下代码时,在每次重新编译并重新执行后,答案(输出)都不相同。 What is a reason for it? 是什么原因呢?

 #include <iostream>
#include <cstdlib>
//#include <pthread.h>

using namespace std;

#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   cout << "Hello World! Thread ID, " << tid << endl;
   pthread_exit(NULL);
}

int main ()
{
   pthread_t threads[NUM_THREADS];
   int rc;
   int i;
   for( i=0; i < NUM_THREADS; i++ ){
      cout << "main() : creating thread, " << i << endl;
      rc = pthread_create(&threads[i], NULL, 
                          PrintHello, (void *)i);
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

g++ test.cpp -o test -lpthread ./test g ++ test.cpp -o test -lpthread ./test

Output1: 输出1:

main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
Hello World! Thread ID, 0
main() : creating thread, 3
Hello World! Thread ID, 1
Hello World! Thread ID, 2
main() : creating thread, 4
Hello World! Thread ID, 3
Hello World! Thread ID, 4

g++ test.cpp -o test -lpthread ./test g ++ test.cpp -o test -lpthread ./test

Output2: 输出2:

main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
main() : creating thread, 3
Hello World! Thread ID, 0
main() : creating thread, 4
Hello World! Thread ID, 3
Hello World! Thread ID, 2
Hello World! Thread ID, 4
Hello World! Thread ID, 1

由于线程未同步,因此执行顺序无法精确确定,并且取决于您的执行上下文,例如,同时正在运行其他哪些进程等,每次运行程序时可能会有所不同。

yes. 是。 I have used of 我已经习惯了
pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex); and pthread_mutex_unlock(&mutex); 和pthread_mutex_unlock(&mutex); as follows 如下

#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>

using namespace std;

#define NUM_THREADS     5
pthread_mutex_t   mutex = PTHREAD_MUTEX_INITIALIZER;
void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   //sleep(1);

 cout << "Hello World! Thread ID, " << tid << endl;

pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}

int main ()
{
   pthread_t threads[NUM_THREADS];
   int rc;
   int i;
//pthread_attr_t attr;
//pthread_attr_init(&attr);
   //pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
   for( i=0; i < NUM_THREADS; i++ ){
pthread_mutex_lock(&mutex);
      cout << "main() : creating thread, " << i << endl;

      rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i);

//sleep(0.5);
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

and my outputs is always: 而我的输出始终是:

main() : creating thread, 0
Hello World! Thread ID, 0
main() : creating thread, 1
Hello World! Thread ID, 1
main() : creating thread, 2
Hello World! Thread ID, 2
main() : creating thread, 3
Hello World! Thread ID, 3
main() : creating thread, 4
Hello World! Thread ID, 4

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM