【问题标题】:Why are not outputs the same after re-executing my multithreading code?为什么重新执行我的多线程代码后输出不一样?
【发布时间】:2014-02-15 11:08:42
【问题描述】:

当我执行以下代码时,每次重新编译和重新执行后,答案(输出)都不相同。这是什么原因?

 #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 ./测试

输出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 ./测试

输出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

【问题讨论】:

    标签: c++ multithreading synchronization


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    是的。我用过
    pthread_mutex_lock(&mutex);和 pthread_mutex_unlock(&mutex);如下

    #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);
    }
    

    我的输出总是:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2022-10-21
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多