如果只有一个线程使用互斥锁,线程之间的共享内存会被破坏吗?

RG5

我遇到需要跨线程访问共享内存中的变量的情况。变量是在许多地方的现有代码中最初定义并不断更新的。我添加的代码将允许此现有代码库作为后台线程运行,但是我需要从此共享变量中读取数据。

我的问题是,每次更新时,是否需要向现有代码库中添加互斥锁?或者我可以在读取数据时将互斥锁添加到新代码中。我在下面创建了以下似乎可以锻炼的小测试用例。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>


typedef struct my_data {

    int shared;

}MY_DATA;

MY_DATA data;
pthread_mutex_t lock;


void *background(void *x_void_ptr)
{
    int i = 0;
    int sleep_time;
    while(i < 10)
    {

        data.shared++;

        printf("BACK thread, Data = %d\n", data.shared);

        sleep_time = rand()%5;
        sleep(sleep_time);
        i++;
    }


    return NULL;

}

int main()
{


    int sleep_time;
    pthread_t bg_thread;


    if(pthread_create(&bg_thread, NULL, background, NULL)) {

        fprintf(stderr, "Error creating thread\n");
        return 1;

    }

    MY_DATA *p_data = &data;

    int i = 0;
    while(i < 10)
    {
        pthread_mutex_lock(&lock);
        printf("FOR thread, Data = %d\n", p_data->shared);


        pthread_mutex_unlock(&lock);
        sleep_time = rand()%5;
        sleep(sleep_time);

        i++;
    }



    // Finish up
    if(pthread_join(bg_thread, NULL)) {

        fprintf(stderr, "Error joining thread\n");
        return 2;

    }


    return 0;

}

输出:

FOR thread, Data = 0
BACK thread, Data = 1
BACK thread, Data = 2
FOR thread, Data = 2
FOR thread, Data = 2
BACK thread, Data = 3
BACK thread, Data = 4
BACK thread, Data = 5
FOR thread, Data = 5
BACK thread, Data = 6
BACK thread, Data = 7
BACK thread, Data = 8
FOR thread, Data = 8
FOR thread, Data = 8
BACK thread, Data = 9
FOR thread, Data = 9
BACK thread, Data = 10
FOR thread, Data = 10
FOR thread, Data = 10
FOR thread, Data = 10

运行多次后,看起来没有数据损坏(即,前台正在读取正确的数据),但是我的直觉是我需要在前台和后台代码中都包含互斥体。

乔纳森·勒夫勒(Jonathan Leffler)

将我的评论中的材料转换成答案。

请注意,进程之间的所有全局内存(线程本地存储和函数中的本地变量除外)在线程之间共享。共享内存是进程之间共享的内存的术语。

无论是线程还是进程正在访问内存,只要有多个执行线程可以同时访问同一内存,就需要确保对访问进行了适当的管理(例如,使用互斥锁)。如今,假设您的机器中只有一个核心在工作,这种情况已经很少见,因此,潜在的并发访问已成为常态。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Qt:如果只有一个编写器线程,我是否需要互斥锁?

在 Python 中,线程之间共享类实例数据和方法,但只有一个特定变量

是否有可能 2 个线程同时锁定一个互斥锁(使用互斥锁包装器)?

如果只有一个线程修改 std::vector,那么同一个线程从 vector 读取时是否需要使用锁?

在c中使用互斥锁进行多线程并一次运行一个线程

如果一个线程锁定了一个互斥锁而没有将其解锁,那么其他线程是否应该被阻塞?

线程和进程之间共享内存

C中线程之间的内存共享

pthreads在线程之间共享内存

Java在两个线程之间共享一个变量

在两个线程之间共享一个ArrayList?

只有一个执行内核的线程在CUDA中的共享内存中实现了数组的声明

在线程之间共享资源(文件,互斥体)

如果我创建一个原子变量,线程之间是否对原子变量进行了所有操作?

如何在多线程之间共享一个事务

如何在多个线程之间共享一个mysql连接?

在进程之间共享条件变量和互斥锁:互斥锁必须先锁定吗?

正确使用进程之间共享的pthread互斥锁

另一个线程是否可以解锁互斥锁,尽管它之前没有获得锁?

即使线程池中只有一个线程,并发也会发生吗?

多线程Java,但只有一个线程在工作

在具有HT的一个内核上执行的线程之间的数据交换将使用什么?

如果我确定每个线程始终将相同的值写入共享内存,应该使用锁吗?

为什么只有一个线程时需要使用线程锁定?(蟒蛇)

只有第一个线程正在使用 python 线程运行

如何在另一个线程中创建互斥锁?

在asp.net中只有一个线程处理一页吗?

Indy TCP套接字可以在两个线程之间共享吗?

线程之间共享静态变量吗?