На самом деле это не одно и то же.
Мьютекс (семафор взаимного исключения) - это средство, ограничивающее использование ресурса одним потоком за раз (причем оба потока, очевидно, могут работать),Когда поток успешно возвращается из вызова pthread_mutex_lock
, он гарантированно является единственным потоком, удерживающим эту блокировку.Любой поток, который пытается заблокировать этот мьютекс после этой точки, как правило, должен ждать, пока поток-владелец не разблокирует его.
Другими словами, поток с блокировкой является единственным потоком, способным манипулировать защищенным этим ресурсом.блокировка (при условии, конечно, что другие потоки не касаются ресурса без предварительного получения блокировки - вы должны играть по правилам).
A pthread_join
, с другой стороны, разрешает потокждать, пока другой поток не выйдет на . Это часто используется в основном потоке, чтобы дождаться выхода всех дочерних потоков (есть другие варианты использования, это просто типичное).Успешный возврат из pthread_join
означает, что другой поток больше не работает.
В показанном вами коде два потока работают одновременно, и приращение counter
и вызов printf
защищены mutex1
.Вызовы pthread_join
в конце main
заставят главный поток ждать, пока два дочерних потока не завершат работу, прежде чем продолжить.
В качестве отступа, вы должны проверить возвращаемые значения с pthread_mutex_lock
, поскольку он может потерпеть неудачу.Вы не хотите идти дальше и модифицировать защищенный ресурс в этом случае, поскольку может произойти повреждение.То же самое для pthread_join
.
И для более комплексного теста лучше подойдет следующая функция:
void *functionC() {
int i;
for (i = 1000; i > 0; i--) {
pthread_mutex_lock (&mutex1);
counter++;
printf ("Counter value: %d\n", counter);
pthread_mutex_unlock (&mutex1);
}
}
, так как с большей вероятностью потоки будут выполняться рядом друг с другом,Без цикла есть большая вероятность, что один поток выйдет еще до того, как начнется второй.