c - 线程同步

标签 c multithreading thread-safety pthreads mutex

我有一个线程锁定互斥量,将值写入变量,然后解锁互斥量。 我在这里打印出来,值已经改变了。我将它设置为 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_movementIdnav_newMovement 变量。

关于c - 线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6019680/

相关文章:

linux 和 gcc 4 中的 C++ 新运算符线程安全

C:计算 2 个 float 模 12 之间的距离

java - 这个线程安全吗

python - 如何在Python中的多处理中跨进程共享大型只读字典/列表?

java - 同步会影响对象成员吗?

multithreading - 在线程环境中不保护共享变量的危险

c - C 中的 FORWARD_NULL 与 UNINIT Coverity 错误

c - C 中分割字符串最快的算法?

c - Pthread 程序在 Codeblocks 和 Linux Kernel 上打印不同的值

c++ - 没有互斥锁的事件通知