2011-05-12 121 views
3

我需要一个字符串作为全局变量。多线程可能会设置全局变量。我应该去为这个互斥体吗?或者操作系统会处理这些操作。 去互斥会影响应用程序的性能。在线程中设置全局变量

我不关心行为发生的顺序。我害怕数据损坏。 有人可以让我知道这件事。

回答

1

这听起来像你理解所有的关注。如果全局变量可能会损坏,那么您肯定需要将其锁定在互斥体中。这将影响性能,因为这部分现在定义为同步。也就是说,您需要根据需要锁定最小部分的代码,以最小化同步代码被调用的时间。

0

什么是你的全局变量?一个指向字符串缓冲区的指针,还是缓冲区本身?

在许多体系结构(包括AFAIR 32位x86)上覆盖单个指针是原子的。

这个例子可能工作:

volatile char **global_var; 

void set_var(char *str) { 
    char *tmp = strdup(str); 
    global_var = &tmp; 
} 
+1

还可以考虑使用平台API提供的任何原子函数(例如,Win32上的InterlockedExchange()) – 2011-05-12 12:16:50

+0

您可能需要旧值才能将其释放。在这种情况下,您必须使用互锁交换。 – wj32 2011-05-12 12:17:39

+0

@Tadeusz:你说得对。我错过了添加,设置全局变量字符串不是赋值。它是一个字符串副本,这是我的担心。理解指针的原子性概念。我甚至尝试过使用一个全局的字符串变量和2个线程作为示例,它适用于每个不同的运行而没有数据损坏。无论如何,我可以从运行中声明。 – 2011-05-12 12:17:58

0

您可以使用Thread-Local Storage这一点。
不幸的是,它没有在当前的C99标准中指定,但可能会在C1X中。目前,您可以使用特定于编译器的实现(GCC,ICC和Visual C)。

+0

我不认为提问者想要线程本地存储;似乎所有线程共享的全局变量是期望的。 – 2011-05-12 12:12:18

0

就标准而言,是的,您必须使用互斥锁。不这样做会导致未定义的行为。在实践中,大多数机器架构对此没有任何问题。 C标准(C1x)的未来版本将具有原子类型,如果在此处使用,它将确保在没有锁定的情况下安全地进行分配(虽然可能使用内部锁定,但在没有真正原子的破碎拱门上)。