2017-12-25 13 views
-1

다른 프로그램의 메모리를 읽는 스레드가 있습니다. 읽은 정보는 전역 변수에 저장됩니다. 그런 다음이 정보에서 작동하는 다른 스레드를 만듭니다.스레드 간 정보 전달

변수를 0으로 초기화했습니다. 첫 번째 스레드가 작성되면 (다른 프로그램의 메모리를 읽는 스레드), 읽은 값을 콘솔에 인쇄하여 값을 올바르게 읽습니다. 필자의 주요 기능에서는 여전히 0으로 인쇄됩니다.

std :: atomic을 시도했지만이 인스턴스에서는 작동하지 않습니다. 같은 스레드에 있지 않아도 변수를 수락하려면 어떻게해야합니까? 여기

내가 스레드를 만드는 방법은 다음과 같습니다

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; 
    } 
} 

감사

다음
std::thread tTest([ & ] 
{ 
    TestFunction(); 
}); 
vecThreads.push_back(move(tTest)); 

std::thread tTest2([ & ] 
{ 
    OtherTestFunction(); 
}); 
vecThreads.push_back(move(tTest2)); 

내가 주에 무엇의 예입니다!

+0

이것은 문제가 아니지만 람다가 필요하지 않습니다. 스레드가 호출 할 함수의 주소를 전달하기 만하면됩니다. –

+1

'bob'은'main' 안에있는 지역 변수입니다. 코드에는 다른 '밥 (bob)'이 정의되어 있지 않으므로 '메인'바깥에있는 '밥 (bob)'의 사용은 합법적이지 않습니다. 실제 코드 게시. –

+0

피트, 때로는 필자의 함수가 매개 변수를 취하는 경우가 있는데, 이렇게하면 다른 방법으로 작업하는 것이 훨씬 쉽습니다. p - "실제 코드"와 마찬가지로 실제로 필요한 것입니다. 다른 것들은 그냥 Bob을 클래스로 바꾸는 것처럼 복잡하게 만들며 그 클래스는 다른 클래스를 상속하고 다른 객체를 정의합니다. –

답변

0

일종의 스레드 동기화를 사용해야합니다. OtherTestFunction 전에 TestFunction이 실행될 것이라는 보장은 없습니다. 그것은 모두 OS가 스레드를 스케줄하는 방법에 달려 있습니다. 이 경우 ReadProcessMemory은 빠른 기능이 아닙니다. OtherTestFunction은 보통 TestFunction이 실행되기 전에 bob에 저장된 값을 얻습니다.

예를 들어 async (<future>)을 사용하여 첫 번째 스레드 (TestFunction 실행)를 만들 수 있습니다. future을 전달 (async)하여 두 번째 스레드 (OtherTestFunction)로 보내면 나중에 첫 번째 스레드가 실행을 마칠 때까지 기다리게됩니다. 그런 다음 bob 값에 액세스 할 수 있습니다.

또한 std::promise을 볼 수도 있고 Windows API에서 CreateEvent 및 관련 함수를 사용할 수도 있습니다. 문제에 대한

+0

나는 첫 번째 스레드가 끝난 후 10 초를 기다렸다가 여전히 작업을하지 못했습니다. –

0

매우 간단하고 우아한 해결책은 이것이다 :

먼저 글로벌 Variable1에 당신의 기능에 다음 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(); 
} 

희망 : 당신의 방법에 다음

이 작업을 수행.

+0

aw man, 요점은 항상 최신 정보가 무엇이든 상관없이 계속해서 메모리를 읽는 스레드와 다른 스레드를 읽는 것입니다. 나는 이것으로 비록 내가 일할 수 있다고 생각한다. 잘하면 다른 해결책이 있습니다. o –

+0

동시에 메모리를 읽고 쓰는 것은 불가능합니다 @ J.Doe –

+0

우리는 동시에 동일한 메모리에 읽고 쓰지 않고 있습니다. 모든 스레드가 볼 수있게하려는 변수. 지금 당장은 아무도 그것을 볼 수 없습니다. 그냥 0을 보여줍니다. –