История изменений
Исправление KivApple, (текущая версия) :
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
List list;
ListItem items[2];
void* thread_func(void* arg) {
ListItem* item = static_cast<ListItem*>(arg);
while (true) {
int retval = pthread_mutex_lock(&mutex);
assert(retval == 0);
list.insertHead(item);
pthread_mutex_unlock(&mutex);
}
}
int main() {
pthread_t threads[2];
pthread_create(&threads[0], nullptr, thread_func, &items[0]);
pthread_create(&threads[1], nullptr, thread_func, &items[1]);
while (true) {
int retval = pthread_mutex_lock(&mutex);
assert(retval == 0);
ListItem* item;
do {
item = list.removeTail();
} while (item);
pthread_mutex_unlock(&mutex);
}
return 0;
}
Вот версия кода с глобальными переменными - валится точно также (заодно добавил проверку ошибок захвата mutex - на этих assert не валится никогда, хоть это и ожидаемо).
Исходная версия KivApple, :
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
List list;
ListItem items[2];
void* thread_func(void* arg) {
ListItem* item = static_cast<ListItem*>(arg);
while (true) {
int retval = pthread_mutex_lock(&mutex);
assert(retval == 0);
list.insertHead(item);
pthread_mutex_unlock(&mutex);
}
}
int main() {
pthread_t threads[2];
pthread_create(&threads[0], nullptr, thread_func, &items[0]);
pthread_create(&threads[1], nullptr, thread_func, &items[1]);
while (true) {
int retval = pthread_mutex_lock(&mutex);
assert(retval == 0);
ListItem* item;
do {
item = list.removeTail();
} while (item);
pthread_mutex_unlock(&mutex);
}
return 0;
}
Вот версия кода с глобальными переменными - валится точно также.