Синхронизация между потоками - PullRequest
0 голосов
/ 30 апреля 2019

Я студент и хочу понять синхронизацию между потоками.

У меня есть две темы t1 и t2.

У меня есть общий кусок памяти между ними.

/*e.g.*/ std::map<std::string, std::string> data;

Один поток, скажем, t1 читает данные, а другой пишет ..

std::mutex mu; //is used for synchronization

std::string read_1(std::string key)
{
    return data[key];
}

std::string read_2(std::string key)
{
    mu.lock();
    return data[key];
    mu.unlock();
}

void write(std::string key, std::string value)
{
    mu.lock();
    data[key] = value;
    mu.unlock();
}

read_1 это потокобезопасно?

если нет, то как лучше оптимизировать этот код?

спасибо.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Нет. read_1 является не потокобезопасным. Необходимо заблокировать мьютекс перед доступом к data.

Это было бы безопасно;

std::string read_1(std::string key)
{
    std::lock_guard<std::mutex> guard(mu);
    return data[key];
}

Также; Ваша read_2 функция нарушена. Возвращается до разблокировки мьютекса. Если бы вы использовали std::lock_guard, то у вас не было бы этой проблемы.

1 голос
/ 30 апреля 2019

read_1 это потокобезопасно?

Нет, это чтение, когда возможна запись в эти данные.

если нет, то как лучше?чтобы оптимизировать этот код?

Используйте std :: shared_mutex возможно.

...