У меня есть один поток, который блокирует мьютекс, записывает значение в переменную, разблокирует мьютекс.
Я делаю распечатку здесь, и значение было изменено. Я установил его на 1.
Когда я читаю значение переменных в другом потоке, используя блокировку, разблокирую мьютекс и считываю значение, я получаю старое значение 0.
Почему это происходит. Я блокирую и разблокирую один и тот же мьютекс правильно.
Как мне синхронизировать потоки?
EDIT:
Я объявляю мьютексы и переменные здесь
static pthread_mutex_t movementIdMutex = PTHREAD_MUTEX_INITIALIZER;
static int nav_movementId = 0;
static pthread_mutex_t newMovementMutex = PTHREAD_MUTEX_INITIALIZER;
static int nav_newMovement = 0;
Я установил здесь переменные
void nav_setMovementIdentifier(int id)
{
printf("Received movement id:%d from connectivity\n", id);
int result; /* Use the result for testing */
result = pthread_mutex_lock(&movementIdMutex);
nav_movementId = id;
printf("nav_movementId is %d\n", nav_movementId);
result = pthread_mutex_unlock(&movementIdMutex);
result = pthread_mutex_lock(&newMovementMutex);
nav_newMovement = 1;
printf("nav_newMovement is %d in the setId function\n", nav_newMovement);
result = pthread_mutex_unlock(&newMovementMutex);
printf("\n");
}
и читайте их здесь
void *startConnectivityListener(void *ptr) {
/* Declare safety variables because segments cant be locked/unlocked
* using mutexes if they are checking in statement such as if and while.
*/
int newMoveCheck = 0;
int startIndoorCheck = 0;
int startOutdoorCheck = 0;
int listening = 1;
while(listening == 1)
{
int result; /* Use for testing */
/* check if a new movement command waits */
result = pthread_mutex_lock(&newMovementMutex);
newMoveCheck = nav_newMovement;
printf("nav new movement in thread is :%d\n", nav_newMovement);
printf("newMoveCheck in mutex lock is:%d\n", newMoveCheck);
result = pthread_mutex_unlock(&newMovementMutex);
result = pthread_mutex_lock(&movementIdMutex);
printf("nav_movementId in thread is %d\n", nav_movementId);
result = pthread_mutex_unlock(&movementIdMutex);
printf("newMoveCheck is %d\n", newMoveCheck);
sleep(1);
if(newMoveCheck == 1)
Я получаю правильные распечатки в установочных функциях операторов printf, он устанавливает значения в id, который передается, и в 1.
Когда я пытаюсь распечатать его там, где я их читаю, оба по-прежнему показывают 0, то есть то, к чему они были установлены при инициализации.