我有一个线程,它锁定一个互斥锁,写一个值到一个变量,解锁互斥锁。我在这里进行了打印,值已更改。我将其设置为1。
当我使用lock在另一个线程中读取变量value时,在互斥锁上解锁并读取该值时,我得到的是旧值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,这是我初始化它们时设置的值。
发布于 2011-05-18 18:41:23
尝试向nav_movementId和nav_newMovement变量添加volatile说明符。
发布于 2011-05-17 00:23:02
这些声明:
static int nav_movementId = 0;
static int nav_newMovement = 0;创建全新的、不同的变量--这就是为什么您看不到对全局变量的修改。声明如下:更新变量的函数作用于全局实例:
extern int nav_movementId;
extern int nav_newMovement;类似地,互斥锁需要是相同的实例-它们需要是全局的,或者您需要安排在模块之间共享它们的地址。
在一个模块中:
pthread_mutex_t movementIdMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t newMovementMutex = PTHREAD_MUTEX_INITIALIZER;在标题(或其他模块)中:
extern pthread_mutex_t movementIdMutex;
extern pthread_mutex_t newMovementMutex;发布于 2011-05-17 00:23:58
这些静态互斥锁和变量和下面的代码是在同一个源文件中,还是在一个头文件中?如果它们在头文件中,而这两个函数位于不同的文件中,那么每个函数都有自己的互斥锁和变量的副本。您需要使它们成为extern而不是static.
另一件事:“侦听器”函数实际上并不是在等待另一个函数设置变量--互斥只是确保它们不会被主动写入。所以,如果你第一次在listener中读到nav_newMovement时,它仍然是0,我不会感到惊讶。更多地解释一下您期望系统如何工作可能会有所帮助。
https://stackoverflow.com/questions/6019680
复制相似问题