小编Wil*_*ill的帖子

我应该互斥锁一个变量吗?

如果在多个线程之间共享一个32位变量,我应该在变量周围放置一个互斥锁吗?例如,假设1个线程写入32位计数器,第2个线程读取它.第二个线程是否有可能读取损坏的值?

我正在研究32位ARM嵌入式系统.编译器似乎始终对齐32位变量,因此可以使用单个指令读取或写入它们.如果32位变量未对齐,则读取或写入将被分解为多个指令,第二个线程可能会读取损坏的值.

如果我将来迁移到多核系统并且变量在核心之间共享,那么这个问题的答案是否会改变?(假设核心之间有共享缓存)

谢谢!

c embedded

11
推荐指数
1
解决办法
1751
查看次数

使用GCC,如何仅导出静态库中的某些功能?

我在GCC中创建了一个静态库,但是我想隐藏大部分符号.

例如,test1.c:

extern void test2(void);
void test1(void) {
  printf("test1: ");
  test2();
}
Run Code Online (Sandbox Code Playgroud)

test2.c中:

extern void test1(void);
void test2(void) {
  printf("test2\n");
}
Run Code Online (Sandbox Code Playgroud)

library_api.c:

extern void test1(void);
extern void test2(void);
void library_api(void) {
  test1();
  test2();
}
Run Code Online (Sandbox Code Playgroud)

现在编译:

gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc -c library_api.c -o library_api.o
ar rcs libapi.a test1.o test2.o library_api.o
Run Code Online (Sandbox Code Playgroud)

如何仅显示"library_api()"函数以显示:

nm libapi.a
Run Code Online (Sandbox Code Playgroud)

而不是函数"test1()","test2()"和"library_api()"?换句话说,如何隐藏"test1()"和"test2()"从显示和可调用到libapi.a的外部用户?我不希望外部用户知道任何有关内部测试功能的信息.

c static

9
推荐指数
1
解决办法
9798
查看次数

C配置API

在设计用于配置库/实用程序的C API时,我有一个同事,他更喜欢将所有配置参数集中到一个函数调用中.例如:

int set_diagnostic_email_config( char *to_address,
                                 bool include_timestamp,
                                 bool send_for_crashes,
                                 bool send_daily_status,
                                 bool send_on_event1,
                                 bool send_on_event2 )
Run Code Online (Sandbox Code Playgroud)

一个类似的"get"函数存在许多参数..这个方法的主要优点是如果有人添加了一个新选项,例如"bool send_on_event3",那么因为原型改变了你被迫更新每个地方这个函数调用是使用(假设人们称之为多个地方).

我更喜欢以下内容:

int get_diagnostic_email_config( struct email_config *p_config );
int set_diagnostic_email_config( struct email_config *p_config );
Run Code Online (Sandbox Code Playgroud)

您只需根据需要更改结构元素.但是......如果有人更新了email_config"结构,它不会强迫人们更新所有使用它的地方(即使我们经常想......).而且我的同事抱怨说如果有人试图初始化手动"email_config",然后如果事情后来添加,那么这些新字段将被取消初始化而没有警告.

关于哪种方法首选,是否有任何强烈的共识?或者还有另一种我想念的选择?

c

6
推荐指数
1
解决办法
314
查看次数

标签 统计

c ×3

embedded ×1

static ×1