从不同的线程访问该类的字段

时间:2013-08-13 12:07:01

标签: c++ vector

我有一个包含Facebook好友数据矢量的课程:

std::vector<FBFriend> m_friends

FB是一个非常简单的结构:

struct FBFriend
{
    std::string ID;
    std::string photoPath;
    std::string name;
    bool installed;
    int score;
};

当我从FB(在异步线程中)下载数据时,我遍历m_friends字段,分配相应的图片,但是我得到了错误的访问错误。

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:0)

从多个线程访问变量时,必须同步读取和写入以避免数据竞争

以下是使用std::mutexstd::lock_guard同步访问权限的简单示例:

std::mutex m;
std::vector<FBFriend> v;

// Add two FBFriend to vector.
v.push_back({"user1", "/photos/steve", "Steve", true, 0});
v.push_back({"user2", "/photos/laura", "Laura", true, 0});

// Change element in vector from a different thread.
auto f = std::async(std::launch::async, [&] {
    std::lock_guard<std::mutex> lock(m); // Aquire lock before writing.
    v[0].photoPath = "/images/steve";
});

f.wait(); // Wait for task to finish.

std::cout << v[0].photoPath << std::endl;
std::cout << v[1].photoPath << std::endl;

输出:

/images/steve
/photos/laura