您好我在运行此脚本时出错。它使用多线程,并在类中有数组。例如,我尝试使用foo1
设置数组,foo
执行while (gg[50] != 40) do xxxxxx
。
我有一个cout
验证数组已设置但是它返回垃圾但是当我在main中询问它返回正确时。有没有解决这个问题?或者在Windows中有更好的方法吗?
#include "stdafx.h"
#include <thread>
#include <iostream>
#include <stdio.h> /* printf */
#include <time.h> /* clock_t, clock, CLOCKS_PER_SEC */
using namespace std;
class bar {
public:
void setarray(int r, double y){
gg[r] = y;
}
void foo() {
int y = 0;
cout << gg[50] << "gg2" << endl;
std::cout << "hello from member function2" << std::endl;
while (gg[50] != 40){
y++;
}
cout << y << " y2" << endl;
}
void foo1() {
int y = 0;
std::cout << "hello from member functiondddw1" << std::endl;
cout << gg[50]<< "gg1"<<endl;
std::thread(&bar::foo, bar()).detach();
while (gg[50] != 40){
y++;
}
cout << y << " y1" << endl;
}
double getarray(int g){
double ek = gg[g];
return ek;
}
private:
double gg[80];
};
int main()
{
bar jj;
int u=0;
cout << "which array" << endl;
cin >> u;
double dd=0;
cout << "which number" << endl;
cin >> dd;
jj.setarray(u, dd);
if( jj.getarray(u) == 3){
clock_t tt;
tt = clock();
std::thread(&bar::foo1, bar()).detach();
tt = clock() - tt;
printf("It took me %d clicks (%f seconds).\n", tt, ((float)tt) / CLOCKS_PER_SEC);
cout << "done" << endl;
}
cout << jj.getarray(50);
u=0;
cout << "which array" << endl;
cin >> u;
dd=0;
cout << "which number" << endl;
cin >> dd;
jj.setarray(u, dd);
cin.get();
return 0;
}
答案 0 :(得分:0)
当cout打印垃圾并且没有时,你的描述就不那么清楚了。但是,如果从线程引用cout,问题是main()不会等到线程完成并实际退出销毁Bar jj实例。这就是为什么要打印垃圾的原因。最佳实践规则 - 主要应该等待所有线程完成,然后再调用返回。
答案 1 :(得分:0)
我找到了一些重写的解决方案。我添加了
void main2()
{
std::thread(&bar::foo1, this).detach();
}
并从main调用并添加。 std :: thread(&amp; bar :: foo,this).detach(); 到另一个功能。