2016-10-28 3 views
0

(C++) 스레드를 사용하지 않고 두 개의 병렬 while 루프를 실행할 가능성이 있습니까? 나는 루프를 하나씩 반복해서 넣으려고했으나, while 조건에서 사용하고있는 변수가 1 루프를 통해 변경되고 둘 다 동일해야하기 때문에 나를 위해 작동하지 않는다. 루프.병렬을 사용하지 않고 while 루프를 사용하는 경우

for (size_t j = 0; j < word.length(); j++) 
{  
    while (word[j] != tmp->data) 
    { 
     counter1++; 
     tmp = tmp->next; 
    } 
    while (word[j] != tmp->data) 
    { 
     counter2++; 
     tmp = tmp->previous; 
    }  
} 
+8

당신이 성취하려는 것과 반대되는 성취를 설명하십시오. –

+0

첫 번째 내부 루프 앞에 원래 'tmp'를 저장하지 말고 두 번째 루프에 저장된 포인터를 사용하십시오. –

+0

또한 포인터를 사용한다고 가정하면 루프 조건에서 역 참조하기 전에'tmp'가 널 포인터가 아님을 확인해야합니다. –

답변

1

주석에서 :

내가 문자열에서 편지를 받고 알파벳 같은 문자에 도착하는 짧은 어떤 경로를 찾을려고 노력하겠습니다 여기에 코드입니다 앞으로 또는 뒤로. 순환 중복 목록을 사용하고 있습니다.

는 두 tmp 포인터 하나 개 while 루프 싶지 않을 것 같은데 : 없음이 스레드없이 불가능하다

for (size_t j = 0; j < word.length(); j++) 
{  
    while (word[j] != tmp1->data && word[j] != tmp2->data) 
    { 
     counter++; 
     tmp1 = tmp1->next; 
     tmp2 = tmp2->previous; 
    }  
} 
+0

예를 들어 tmp1이 목표에 먼저 도달하면 카운터는 tmp2가 도달하기 전에 점점 더 많이 증가 할 것입니다. 하지만 어쩌면 || & insread가 작동합니다.감사합니다 –

+0

@niksrb tmp1 또는 tmp2가 목표에 도달 할 때까지 루프가 실행됩니다. tmp1이 처음에 도달하면 앞으로가는 것이 가장 짧은 경로입니다. 결과를 찾았으므로 계속할 필요가 없습니다. 'while'조건은 주어진 문제에 맞습니다. – Oktalist

0

를 (또는 간을 사용할 수 있지만 나는이 요점없는 것 같다)

std::futurestd::async

과 같이 "수동"스레딩을 사용하지 않아도됩니다. earch과 같은 기능 :

int forward(std::string word) 
{ 
    int counter = 0; 
    for (size_t j = 0; j < word.length(); j++) 
    {  
     while (word[j] != tmp->data) 
     { 
      counter++; 
      tmp = tmp->next; 
     }  
    } 
    return counter; 
} 

또는

각각의 backwards와 같이 그들에게 전화.

std::string word = //.... 
auto res1 = std::async(std::launch::async, forward,word); 
auto res2 = std::async(std::launch::async, forward,word); 

//do whatever.... 

int counter1 = res1.get(); //get the result 
int counter2 = res2.get(); 

get은 스레드가 완료 될 때까지 차단됩니다. 그러나 그들은 동시에 병행 할 것입니다.

문자열/알파벳 및 알고리즘의 크기에 따라 귀하의 경우에는 여러 스레드에서이 작업을 수행하는 것이 많은 이익을 얻지 않을지 의심 스럽지만. 스레딩 오버 헤드는 전체 계산보다 오래 걸릴 수 있으므로이 단일 스레드를 수행하는 것이 더 빠르면 측정해야합니다.

관련 문제