在线程之间传递信息

问题描述 投票:-1回答:2

我有一个线程读取另一个程序的内存。读取的信息存储在全局变量中。然后,我创建另一个作用于此信息的线程。

我已经将变量初始化为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;
    }
}

谢谢!

c++ multithreading
2个回答
0
投票

您需要使用某种线程同步。无法保证TestFunction将在OtherTestFunction之前运行;这一切都取决于操作系统如何安排线程。在这种情况下,ReadProcessMemory不是一个快速的功能。 OtherTestFunction通常会在TestFunction获得存储在bob中的值之前完成运行。

例如,你可以使用async(来自<future>)来创建你的第一个线程(运行TestFunction)。通过(通过移动)你从future获得的async到你的第二个线程(OtherTestFunction),这将等待第一个线程完成执行的未来。然后它可以访问bob的值。

你也可以查看std::promise,或者你可以在Windows API中使用CreateEvent和相关函数。


0
投票

一个非常简单而优雅的解决方案是:

首先声明一个全局变量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

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.