我有一个线程锁定互斥量,将值写入变量,然后解锁互斥量。 我在这里打印出来,值已经改变了。我将它设置为 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 函数 printf 语句中得到了正确的打印输出,它将值设置为传入的 id 和 1。
当我尝试在我阅读它们的地方打印它时,两者仍显示 0,这是我初始化它们时设置的值。
最佳答案
尝试将 volatile
说明符添加到 nav_movementId
和 nav_newMovement
变量。
关于c - 线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6019680/