Saya menggunakan multithreading untuk membaca dan menulis variabel global std::deque<int> g_to_be_downloaded_tasks, dan saya menggunakan std::mutex untuk melindungi akses bersamaan. tetapi ThreadB tidak bisa mendapatkan elemen setelah ThreadA memasukkan elemen ke vektor ini,

UtasA

g_to_be_downloaded_tasks_mutex.try_lock();
g_to_be_downloaded_tasks.push_back(temp);
g_to_be_downloaded_tasks_mutex.unlock();

ThreadB: ThreadB mendapat 0 setelah menggunakan g_to_be_downloaded_tasks.size()

g_to_be_downloaded_tasks_mutex.try_lock();
if(g_to_be_downloaded_tasks.size() > 0)
{
    curr_task = g_to_be_downloaded_tasks.front();
}
g_to_be_downloaded_tasks_mutex.unlock();

Mengapa g_to_be_downloaded_tasks.size() mengembalikan 0 ?

0
Yongqi Z 12 Mei 2021, 07:55

1 menjawab

Jawaban Terbaik

Anda mengabaikan hasil try_lock, jadi Anda tidak menggunakan mutex secara bermakna. Kode Anda memiliki perilaku yang tidak ditentukan karena perlombaan data.

Jika Anda tidak ingin memblokir, gunakan hasil try_lock

if (g_to_be_downloaded_tasks_mutex.try_lock()) {
    g_to_be_downloaded_tasks.push_back(temp);
    g_to_be_downloaded_tasks_mutex.unlock();
}

if(g_to_be_downloaded_tasks_mutex.try_lock() && (g_to_be_downloaded_tasks.size() > 0))
{
    curr_task = g_to_be_downloaded_tasks.front();
    g_to_be_downloaded_tasks_mutex.unlock();
}

Lebih umum, sisi produksi akan menunggu kunci, jika tidak maka akan membuang pekerjaan

{
    std::lock_guard guard(g_to_be_downloaded_tasks_mutex);
    g_to_be_downloaded_tasks.push_back(temp);
}
3
Caleth 12 Mei 2021, 07:58