LINUX.ORG.RU

История изменений

Исправление 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;
}

Вот версия кода с глобальными переменными - валится точно также.