У меня есть один поток, который блокирует мьютекс, записывает значение в переменную, разблокирует мьютекс. Я делаю распечатку здесь, и значение было изменено. Я установил его на 1.
Когда я читаю значение переменных в другом потоке, используя блокировку, разблокировку мьютекса и чтение значения, я получаю старое значение 0.
Почему это происходит. Я правильно блокирую и разблокирую один и тот же мьютекс.
Как синхронизировать темы?
РЕДАКТИРОВАТЬ:
Я объявляю мьютексы и переменные здесь
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)
Я получаю правильные распечатки в операторах setter functions printf, он устанавливает значения для переданного id и 1.
Когда я пытаюсь распечатать его там, где я их читал, оба по-прежнему показывают 0, что было установлено при их инициализации.