У меня такая странная проблема с потоками. На моем Mac с OS X это прекрасно работает, но как только я больше расскажу о своем рабочем столе, на котором работает Ubuntu, я столкнулся с проблемами.Thread Synchronization C++
По сути то, что я делаю следующее:
Function() {
for(i = 1 to 10)
while(array not completely changed) {
pthread_mutex_lock(&lock);
-- perform actions
pthread_mutex_unlock(&unlock);
}
}
}
И у меня есть две темы, работающие эту функцию. Несмотря на то, что, как предполагается, работает таким образом, что:
Thread 1 grabs lock
performs opperations on array
Thread 1 releases lock
Thread 2 grabs lock
performs calculations on array
Thread 2 releases lock
и так далее в спину и вперед образец до тех пор, пока массив не были завершены изменены, но в Linux все из расчета резьбы 1 завершена, а затем Начинается тема 2.
Так что я получаю:
Thread 1 grabs lock
performs opperations on array
Thread 1 releases lock
Thread 1 grabs lock
performs calculations on array
Thread 1 releases lock
Thread 1 grabs lock
performs calculations on array
Thread 1 releases lock
И так далее, пока массив не будет полностью изменен, как только я приращение для цикла, то поток 2 будет выполнять все расчеты и продолжить эту картину.
Может ли кто-нибудь объяснить, что происходит?
Это планировщик потоков, что вы заинтересованы в. Проверьте это http://man7.org/linux/man-pages/man7/sched.7.html. Начиная с версии 3.14, Linux предоставляет политику планирования сроков (SCHED_DEADLINE). Вероятно, вы заинтересованы в круговой политике. – alvits
Обратите внимание: у нас есть класс 'std :: thread' в текущем стандарте C++, который должен использоваться предпочтительно над API-интерфейсом библиотеки pthreads'. –
Если вы хотите принудительно переключиться на определенный поток, вам нужно управлять этим самостоятельно, иначе совершенно случайно, какой поток получит блокировку (это не тот порядок, по которому они доходят до блокировки). –