在线程之间传递信息

时间:2017-12-25 02:44:56

标签: c++ multithreading

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

例如,您可以使用<future>(来自TestFunction)创建第一个线程(运行future)。将asyncOtherTestFunction传递给第二个线程(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();
}

希望这有帮助。