我有一个线程读取另一个程序的内存。读取的信息存储在全局变量中。然后,我创建另一个作用于此信息的线程。
我已经将变量初始化为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;
}
}
谢谢!
您需要使用某种线程同步。无法保证TestFunction
将在OtherTestFunction
之前运行;这一切都取决于操作系统如何安排线程。在这种情况下,ReadProcessMemory
不是一个快速的功能。 OtherTestFunction
通常会在TestFunction
获得存储在bob
中的值之前完成运行。
例如,你可以使用async
(来自<future>
)来创建你的第一个线程(运行TestFunction
)。通过(通过移动)你从future
获得的async
到你的第二个线程(OtherTestFunction
),这将等待第一个线程完成执行的未来。然后它可以访问bob
的值。
你也可以查看std::promise
,或者你可以在Windows API中使用CreateEvent
和相关函数。
一个非常简单而优雅的解决方案是:
首先声明一个全局变量qazxsw poi
然后在你的函数中这样做:
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
希望这可以帮助。