我想用一个线程创建一个长度为50的数组,完成后,我想用第二个线程每X秒打印一些第一个值。同时,第一个线程可以计算下一个数组。

直到我尝试从一些临时变量中复制计算数组中的某些值之前,这些线程才起作用。我没有编译错误,但是当我运行程序时,我得到了Windows崩溃按摩。

没有线程,双* newarray();功能起作用。返回一个手动分配并填充数据的数组。

我在这里想念什么?

线程1:

 double *newarray();

 void *computingU(void *)
 {
     double * U_tmp;

     while (true)

     {
         pthread_mutex_lock( &mutexU );

         memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);

         while (!Usent);

         Usent = false;


         memcpy(Ucmd,U_tmp,sizeof(double)*Ulenght);

         pthread_mutex_unlock( &mutexU );

         Ucomputed = true;
     }
}


线程2:

void *sendingCMD(void * ) {
    double * U_tmp;

    while (true)
    {

        while (!Ucomputed);

        Ucomputed = false;

        pthread_mutex_lock( &mutexU );

        memcpy(U_tmp,Ucmd,sizeof(double)*Ulenght);

        pthread_mutex_unlock( &mutexU );

        Usent = true;

        for (int i = 0; i<Ulenght; i++)
        {

           printf("i= %d, u= %f", i, U_tmp[i]);

           sleep(sleepTime) ;
        }

    }
}


主要:

#include <pthread.h>
#include <time.h>
#include <math.h>
#include <unistd.h>

using namespace std;

bool Ucomputed = false, Usent = true;
double * Ucmd;
pthread_mutex_t mutexU = PTHREAD_MUTEX_INITIALIZER;
unsigned int Ulenght = 1;
int sleepTime = 1;

int main( void )
{
    #ifdef DEBUG_THREAD
    int rc1, rc2;

    pthread_t thread1, thread2;
   /* Create independent threads each of which will execute functionC */
   if( (rc1=pthread_create( &thread1, NULL, &computingU, NULL)) )   {
      printf("Thread creation failed: %d\n", rc1);
   }

   if( (rc2=pthread_create( &thread2, NULL, &sendingCMD, NULL)) )
   {
      printf("Thread creation failed: %d\n", rc2);
   }
    #endif //

    sleep(10);

    while (true);
}

最佳答案

让我们使用computingU函数中的第一个线程,那里有一个局部变量:

double * U_tmp;


稍后,您使用此变量:

memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);


但是您无处初始化变量,因此它没有指向任何内容。由于未初始化(非静态)的局部变量具有不确定的值,因此指针U_tmp将指向看似随机的位置。在此处写入将导致undefined behavior,并且很可能导致崩溃。

而且您在另一个线程中遇到了同样的问题。

关于c++ - pthread Windows崩溃C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25846121/

10-16 23:31