Мьютекс и список - это два отдельных объекта.Ничто не мешает вам получить доступ к списку за пределами мьютекса и, таким образом, не гарантирует взаимное исключение (отсюда и название мьютекса).
Вы часто будете видеть такой код:
GMutext* lock;
GList* list
void addData(string data) {
g_mutex_lock (lock);
g_list_prepend(list, data);
g_mutex_unlock (lock);
}
string getData() {
g_mutex_lock (lock);
GList* data = g_list_first (list);
g_list_remove(list, data);
g_mutex_unlock (lock);
return data;
}
Это гарантирует, что список всегда доступен безопасно.Если другой метод обращается к списку напрямую, не используя тот же мьютекс, нет гарантии, в каком состоянии находится список (например, какие данные извлекаются / добавляются).