C++ pthread windows崩溃C++;

C++ pthread windows崩溃C++;,c++,arrays,windows,multithreading,pthreads,C++,Arrays,Windows,Multithreading,Pthreads,我想用一个线程创建一个长度为50的数组,完成后,我想用第二个线程每隔X秒打印一些第一个值。同时,第一个线程可以计算下一个数组 在我尝试将计算数组中的一些值复制到一些临时变量中之前,线程都是功能性的。我没有编译错误,但是当我运行程序时,我得到了一个windows崩溃消息 没有线程的double*newarray()功能正常。返回手动分配并填充数据的数组 我错过了什么 线程1: double *newarray(); void *computingU(void *) { doubl

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

在我尝试将计算数组中的一些值复制到一些临时变量中之前,线程都是功能性的。我没有编译错误,但是当我运行程序时,我得到了一个windows崩溃消息

没有线程的double*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) ;
        }

    }
}
void*sendingCMD(void*){
双*U_tmp;
while(true)
{
而(!u计算);
uComputerd=假;
pthread_mutex_lock(&mutexU);
memcpy(U_tmp、Ucmd、sizeof(双倍)*Ulenght);
pthread_mutex_unlock(&mutexU);
Usent=真;

对于(int i=0;i让我们取
computingU
函数中的第一个线程,这里有一个局部变量:

double * U_tmp;
memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);
稍后将使用此变量:

double * U_tmp;
memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);
但是在任何地方都不能初始化变量,因此它不会指向任何东西。由于未初始化(非静态)的局部变量具有不确定的值,因此指针
U_tmp
将指向一个看似随机的位置。在那里写入将导致崩溃,而且很可能导致崩溃


另一个线程也有同样的问题。

让我们在
computingU
函数中取第一个线程,这里有一个局部变量:

double * U_tmp;
memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);
稍后将使用此变量:

double * U_tmp;
memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);
但是在任何地方都不能初始化变量,因此它不会指向任何东西。由于未初始化(非静态)的局部变量具有不确定的值,因此指针
U_tmp
将指向一个看似随机的位置。在那里写入将导致崩溃,而且很可能导致崩溃


另一个线程也有同样的问题。

让我们在
computingU
函数中取第一个线程,这里有一个局部变量:

double * U_tmp;
memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);
稍后将使用此变量:

double * U_tmp;
memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);
但是在任何地方都不能初始化变量,因此它不会指向任何东西。由于未初始化(非静态)的局部变量具有不确定的值,因此指针
U_tmp
将指向一个看似随机的位置。在那里写入将导致崩溃,而且很可能导致崩溃


另一个线程也有同样的问题。

让我们在
computingU
函数中取第一个线程,这里有一个局部变量:

double * U_tmp;
memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);
稍后将使用此变量:

double * U_tmp;
memcpy(U_tmp,newarray(),sizeof(double)*Ulenght);
但是在任何地方都不能初始化变量,因此它不会指向任何东西。由于未初始化(非静态)的局部变量具有不确定的值,因此指针
U_tmp
将指向一个看似随机的位置。在那里写入将导致崩溃,而且很可能导致崩溃

在另一个线程中也有同样的问题。

请看:

 double * U_tmp;
您从未将指针设置为指向任何对象,然后尝试将memcpy()数据插入其中。每次都会100%崩溃。如果不这样做,您的操作系统将被破坏。

请查看:

 double * U_tmp;
您从未将指针设置为指向任何对象,然后尝试将memcpy()数据插入其中。每次都会100%崩溃。如果不这样做,您的操作系统将被破坏。

请查看:

 double * U_tmp;
您从未将指针设置为指向任何对象,然后尝试将memcpy()数据插入其中。每次都会100%崩溃。如果不这样做,您的操作系统将被破坏。

请查看:

 double * U_tmp;


您从未将指针设置为任何对象,然后尝试使用memcpy()数据。每次都会100%崩溃。如果不这样做,您的操作系统就会损坏。

为什么在
computingU
中锁定互斥锁两次?这是我在cpy代码时的错误。为什么在
computingU
中锁定互斥锁两次?这是我在cpy代码时的错误。为什么在
computingU
中锁定互斥锁两次?这是我在cpy处理代码时犯的错误。为什么在
computingU
中锁定互斥锁两次?这是我在cpy处理代码时犯的错误。不能保证它会崩溃。这很有可能。它会在100%的时间内破坏堆栈,因为局部变量的总内存大小是