2009-02-23 49 views
4

的成员变量我使用一个对象来启动升压线程,它有我在线程修改(在()运算符)某些公共成员变量。我如何从线程外部访问对象的成员变量?访问升压线程对象

我尝试使用既在对象的运算符(),并从外面锁上互斥(在对象的类中定义),但它似乎并没有工作。

这里的线程对象代码:

struct Mouse 
{ 
    int x, y; 
    string port; 

    boost::mutex mutex; 

    Mouse(const string& p) : port(p) { x = y = 0; } 
    Mouse(const Mouse& m) : mutex() { x = m.x; y = m.y; port = m.port; } 

    void operator()() 
    { 
    ifstream ifs; 
    ifs.open (port.c_str(), ios::binary); 
    if (!ifs.is_open()) 
    { 
     cout << "Impossible d'ouvrir " << port.c_str() << "\n"; 
     exit(0); 
    } 
    while (true) //modify x, y in infinit loop 
     { 
    char buf[3]; 
    ifs.read(buf, 3); 
     unsigned char * msg = (unsigned char *) buf; 
    unsigned char xsign = (msg[0]>>4) & 1; 
    unsigned char ysign = (msg[0]>>5) & 1; 
     unsigned char always1 = (msg[0]>>3) & 1; 
    short dx = msg[1] - 256*xsign; 
    short dy = msg[2] - 256*ysign; 
    { 
     boost::mutex::scoped_lock lock(mutex); 
     x += abs(dx); 
     y += dy; 
    } 
     } 
    } 
}; 

而这正是我试图访问该鼠标的变量x和y:

{ 
    boost::mutex::scoped_lock leftlock(leftMouse.mutex); 
    xLeft = leftMouse.x; 
    yLeft = leftMouse.y; 
    } 
    { 
    boost::mutex::scoped_lock rightlock(rightMouse.mutex); 
    xRight = rightMouse.x; 
    yRight = rightMouse.y; 
    } 
    cout << xRight << " " << yRight << endl; //this always prints 0 0 
+0

请问您可以发布一些代码,看看究竟是如何工作? – 2009-02-23 23:29:06

回答

10

boost::thread副本传给线程函数内部存储,所以如果你开始你的线程这样,该线程将上mouse不同的拷贝操作:

int main() { 
    Mouse mouse("abc.txt"); 
    boost::thread thr(mouse); // thr gets a copy of mouse 
    ... 
    // thread changes it's own copy of mouse 
    ... 
} 

您可以使用boost::ref传递一个参照现有的对象,而不是:

Mouse mouse("abc.txt"); 
    boost::thread thr(boost::ref(mouse)); // thr gets a reference of mouse 

在这种情况下将thr修改全局mouse对象,但是您必须确保mouse不会超出范围,否则在thr完成之前会被摧毁。

0

好了,现在我看得更清楚。一些建议看你的代码:

  1. 不要暴露内部互斥体。
  2. 写入锁定和解锁互斥锁的访问操作。通过这种方式,您不必为了有效地锁定(和解锁)互斥体而转接您的课程的用户。
  3. 线程之前从文件中读取的数据。可能是读取阻塞,或者其他线程获取数据的速度太慢。如果您之前读取数据,然后启动线程,则在客户端访问线程数据时读取所有数据。