gpt4 book ai didi

c - 如何在不使用 C 中的锁的情况下以原子方式修改结构元素?

转载 作者:太空宇宙 更新时间:2023-11-04 04:48:14 25 4
gpt4 key购买 nike

我想以原子方式修改结构的某些元素。我当前的实现使用互斥体来保护关键代码,如下所示。

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

pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;

#define ITER 100000

typedef struct global_status {
int32_t context_delta;
uint32_t global_access_count;
} global_status_t;

global_status_t g_status;

void *context0(void *ptr)
{
unsigned int iter = ITER;
while (iter--) {
wait_event_from_device0();
pthread_mutex_lock(&thread_mutex);
g_status.context_delta++;
g_status.global_access_count++;
pthread_mutex_unlock(&thread_mutex);
}

return NULL;
}

void *context1(void *ptr)
{
unsigned int iter = ITER;
while (iter--) {
wait_event_from_device1();
pthread_mutex_lock(&thread_mutex);
g_status.context_delta--;
g_status.global_access_count++;
pthread_mutex_unlock(&thread_mutex);
}

return NULL;
}

int main(int argc, char **argv)
{
pthread_t tid0, tid1;
int iret;

if ((iret = pthread_create(&tid0, NULL, context0, NULL))) {
fprintf(stderr, "context0 creation error!\n");
return EXIT_FAILURE;
}

if ((iret = pthread_create(&tid1, NULL, context1, NULL))) {
fprintf(stderr, "context1 creation error!\n");
return EXIT_FAILURE;
}

pthread_join(tid0, NULL);
pthread_join(tid1, NULL);

printf("%d, %d\n", g_status.context_delta, g_status.global_access_count);
return 0;
}

我计划将这段代码移植到一个不支持 posix 的 RTOS 中,我想在不使用互斥锁或禁用/启用中断的情况下以原子方式执行此操作。

我该如何做这个操作?是否可以使用“原子比较和交换功能”(CAS)?

最佳答案

在您的示例中,您似乎有两个线程为不同的设备提供服务。您也许可以使用每个设备结构完全取消锁定。全局将是所有每个设备统计信息的聚合。如果您确实需要锁,您可以使用 CAS、LL/SC 或任何受支持的底层原子结构。

关于c - 如何在不使用 C 中的锁的情况下以原子方式修改结构元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18773934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com