gpt4 book ai didi

c - 如果只有一个线程使用互斥体,跨线程的共享内存会被损坏吗?

转载 作者:行者123 更新时间:2023-11-30 18:12:24 25 4
gpt4 key购买 nike

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

我的问题是每次更新时都需要向现有代码库添加互斥体吗?或者我可以在读取数据时向新代码添加互斥体吗?我创建了下面的小测试用例,看起来很有效。

#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

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

最佳答案

从我的 comment 传输 Material 进入答案。

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

无论内存是由线程还是进程访问,只要有多个执行线程可能同时访问同一内存,您就需要确保正确管理访问(例如使用互斥体)。如今,假设机器上有一个正在工作的内核很少是安全的,因此潜在的并发访问已成为常态。

关于c - 如果只有一个线程使用互斥体,跨线程的共享内存会被损坏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222241/

25 4 0