在线程中设置全局变量

时间:2011-05-12 11:56:29

标签: c mutex global

我需要一个字符串作为全局变量。多个线程可以设置全局变量。我应该为此寻求互斥吗?或OS将处理此类操作。 使用互斥锁会影响应用程序性能。

我并不担心行动的顺序。我害怕数据损坏。 有人可以告诉我这个。

4 个答案:

答案 0 :(得分:1)

听起来你理解所有的担忧。如果全局变量可能已损坏,则肯定需要将其锁定在互斥锁中。这将影响性能,因为根据定义,这部分现在将是同步的。话虽这么说,您将希望根据需要锁定代码的最小部分,以最大限度地减少调用同步代码的时间。

答案 1 :(得分:0)

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

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

此示例可能有效:

volatile char **global_var;

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

就标准而言,是的,您必须使用互斥锁。如果不这样做会导致未定义的行为。实际上,大多数机器架构都没有问题。 C标准(C1x)的未来版本将具有原子类型,如果在这里使用,肯定会使得没有锁定的分配安全(尽管可能使用内部锁定,在缺少真正原子的破坏的拱门上)。