首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程同步

线程同步
EN

Stack Overflow用户
提问于 2011-05-16 23:30:05
回答 4查看 2.4K关注 0票数 2

我有一个线程,它锁定一个互斥锁,写一个值到一个变量,解锁互斥锁。我在这里进行了打印,值已更改。我将其设置为1。

当我使用lock在另一个线程中读取变量value时,在互斥锁上解锁并读取该值时,我得到的是旧值0。

为什么会发生这种情况。我正确地锁定和解锁了同一个互斥锁。

如何同步线程?

编辑:

我在这里声明了互斥锁和变量

代码语言:javascript
复制
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;

我在这里设置了变量

代码语言:javascript
复制
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");
}

在这里阅读它们

代码语言:javascript
复制
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,这是我初始化它们时设置的值。

EN

回答 4

Stack Overflow用户

发布于 2011-05-18 18:41:23

尝试向nav_movementIdnav_newMovement变量添加volatile说明符。

票数 1
EN

Stack Overflow用户

发布于 2011-05-17 00:23:02

这些声明:

代码语言:javascript
复制
static int nav_movementId = 0;
static int nav_newMovement = 0;

创建全新的、不同的变量--这就是为什么您看不到对全局变量的修改。声明如下:更新变量的函数作用于全局实例:

代码语言:javascript
复制
extern int nav_movementId;
extern int nav_newMovement;

类似地,互斥锁需要是相同的实例-它们需要是全局的,或者您需要安排在模块之间共享它们的地址。

在一个模块中:

代码语言:javascript
复制
pthread_mutex_t movementIdMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t newMovementMutex = PTHREAD_MUTEX_INITIALIZER;

在标题(或其他模块)中:

代码语言:javascript
复制
extern pthread_mutex_t movementIdMutex;
extern pthread_mutex_t newMovementMutex;
票数 0
EN

Stack Overflow用户

发布于 2011-05-17 00:23:58

这些静态互斥锁和变量和下面的代码是在同一个源文件中,还是在一个头文件中?如果它们在头文件中,而这两个函数位于不同的文件中,那么每个函数都有自己的互斥锁和变量的副本。您需要使它们成为extern而不是static.

另一件事:“侦听器”函数实际上并不是在等待另一个函数设置变量--互斥只是确保它们不会被主动写入。所以,如果你第一次在listener中读到nav_newMovement时,它仍然是0,我不会感到惊讶。更多地解释一下您期望系统如何工作可能会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6019680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档