相关疑难解决方法(0)

C++线程,共享数据

我有一个应用程序,其中2个线程正在运行...当我从一个线程更改一个全局变量时,是否有任何证据,另一个会注意到这个变化?我没有任何同步或互斥系统......但是这段代码应该一直工作(想象一下名为dataUpdated的全局bool):

线程1:

while(1) {
    if (dataUpdated)
        updateScreen();
    doSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

线程2:

while(1) {
    if (doSomething())
        dataUpdated = TRUE;
}
Run Code Online (Sandbox Code Playgroud)

像gcc这样的编译器是否以不检查全局值的方式优化此代码,只在编译时考虑它的值(因为它会在同一个thred中更改)?

PS:对于类似游戏的应用程序而言,在写入值时是否会有读取真的无关紧要......重要的是这个更改会被其他线程注意到.

c++ multithreading synchronization mutex

28
推荐指数
4
解决办法
3万
查看次数

如何在Windows中创建线程安全的单例模式?

我一直在阅读有关线程安全的单例模式:

http://en.wikipedia.org/wiki/Singleton_pattern#C.2B.2B_.28using_pthreads.29

它在底部说,唯一安全的方法是使用pthread_once - 这在Windows上不可用.

这是保证线程安全初始化的唯一方法吗?

我在SO上读过这个帖子:

C++中单例的线程安全延迟构造

并且似乎暗示了原子操作系统级别的交换和比较功能,我在Windows上假设:

http://msdn.microsoft.com/en-us/library/ms683568.aspx

这可以做我想要的吗?

编辑:我想懒惰的初始化,因为只有一个类的实例.

另一个网站上有人提到在命名空间中使用全局(并且他将单例描述为反模式) - 它如何成为"反模式"?

一般承认的答案:
我已经接受了Josh的回答,因为我正在使用Visual Studio 2008 - 注意:对于未来的读者,如果您不使用此编译器(或2005) - 请勿使用接受的答案!

编辑: 除了return语句之外代码工作正常 - 我收到错误:错误C2440:'return':无法从'volatile Singleton*'转换为'Singleton*'.我应该将返回值修改为易失性Singleton*吗?

编辑:显然const_cast <>将删除volatile限定符.再次感谢Josh.

c++ windows singleton

16
推荐指数
2
解决办法
2万
查看次数

我可以在没有互斥锁的线程中读取bool变量吗?

如果我不使用互斥锁,以下源代码有什么问题吗?

bool bStop = false;

void thread1_fun()
{
    while (!bStop)
    {
        doSomething();
    }
}

void thread2_fun()
{
    bStop = true;
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading mutex

2
推荐指数
2
解决办法
1782
查看次数