我在多线程程序中广泛使用了这个简单的函数:
char *Serial2String(char *serial) {
static char str[LENGTH * 2 + 1];
sprintf(str, "%08x%08x",
ntohl(*(uint32_t *)(&serial[0])),
ntohl(*(uint32_t *)(&serial[LENGTH / 2])));
return str;
}
我从不同的线程上下文中调用它,静态变量不受并发保护。所以迟早会发生错误...我创建了这个函数来简化代码所需的代码,但却产生了并发问题。我正在寻找一种方法:
换句话说,如何以线程安全的方式以可移植的方式(从字节顺序)以特定顺序打印LENGTH
字节?
编辑我通常直接在printf
语句中调用它:
printf("error: no such device, serial:%s\n", Serial2String(&buf[1]));
答案 0 :(得分:4)
我看到了几个选项。
使用malloc:
在函数内分配字符串const char *str = Serial2String(serial);
// Use the string, free when you're done
free(str);
或者,让调用者在内存中传递一个字符串:
char str[256];
str = Serial2String(serial, str, 256);
如果您只在printf中使用它,则可以执行以下操作:
#define SERIAL_FORMAT "%08x%08x"
#define SERIAL2STR(s) ntohl(*(uint32_t *)(&s[0])), ntohl(*(uint32_t *)(&s[LENGTH / 2]))
printf("The serial is:" SERIAL_FORMAT "\n", SERIAL2STR(serial));