我想用一个线程创建一个长度为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/