我有一个线程可以读取另一个程序的内存。读取的信息存储在全局变量中。然后,我创建另一个作用于此信息的线程。
我已将变量初始化为0.在创建第一个线程(读取另一个程序的内存的线程)之后,它会打印到控制台读取的值(它成功正确读取值)。但是,在我的主要功能中,它仍打印为零。
我尝试过std :: atomic,但这对这个实例不起作用。尽管不在同一个线程中,我怎样才能让我的变量接受更改?
以下是我创建线程的方法:
std::thread tTest( [ & ]
{
TestFunction( );
} );
vecThreads.push_back( move( tTest ) );
std::thread tTest2( [ & ]
{
OtherTestFunction( );
} );
vecThreads.push_back( move( tTest2 ) );
这是我在main中做的一个例子:
int bob = 0;
int main( )
{
CreateThreads( );
if ( bob )
{
std::cout << "T2 bob: " << bob << std::endl;
}
else
{
std::cout << "T2 bob: uninitialized" << std::endl;
}
}
我的测试功能:
void TestFunction( )
{
ReadProcessMemory( hProcess, lpBaseAddress, &bob, sizeof(bob), 0 );
std::cout << "T1 bob: " << bob << std::endl;
}
void OtherTestFunction( )
{
if ( bob )
{
std::cout << "T2 bob: " << bob << std::endl;
}
else
{
std::cout << "T2 bob: uninitialized" << std::endl;
}
}
谢谢!
答案 0 :(得分:0)
您需要使用某种线程同步。无法保证OtherTestFunction
将在ReadProcessMemory
之前运行;这一切都取决于操作系统如何安排线程。在这种情况下,OtherTestFunction
不是一个快速的功能。在TestFunction
获取存储到bob
的值之前,async
通常会完成运行。
例如,您可以使用<future>
(来自TestFunction
)创建第一个线程(运行future
)。将async
从OtherTestFunction
传递给第二个线程(bob
),这将等待第一个线程完成执行的未来。然后它可以访问std::promise
。
您还可以查看CreateEvent
,也可以使用Windows API中的dict
及相关功能。
答案 1 :(得分:0)
您的问题的一个非常简单和优雅的解决方案是:
首先声明一个全局变量L std::mutex mut;
然后在你的函数中执行以下操作:
void TestFunction( )
{
mu.lock();
ReadProcessMemory( hProcess, lpBaseAddress, &bob, sizeof(bob), 0 );
std::cout << "T1 bob: " << bob << std::endl;
mu.unlock()
}
void OtherTestFunction( )
{
mu.lock();
if ( bob )
{
std::cout << "T2 bob: " << bob << std::endl;
}
else
{
std::cout << "T2 bob: uninitialized" << std::endl;
}
mu.unlock();
}
如果您需要确保一个函数在另一个函数之前运行,请创建另一个全局变量,如下所示:bool firstRan
。
然后在你的方法中这样做:
void TestFunction( )
{
mu.lock();
ReadProcessMemory( hProcess, lpBaseAddress, &bob, sizeof(bob), 0 );
std::cout << "T1 bob: " << bob << std::endl;
firstRan = true;
mu.unlock()
}
void OtherTestFunction( )
{
while(!firstRan) {}
mu.lock();
if ( bob )
{
std::cout << "T2 bob: " << bob << std::endl;
}
else
{
std::cout << "T2 bob: uninitialized" << std::endl;
}
mu.unlock();
}
希望这有帮助。