2016-10-28 3 views
0

(C++) Есть ли возможность запуска двух параллельных циклов без использования потоков? Я попытался поместить их один за другим, как в одном для цикла, но он не работает для меня, потому что переменная, которую я использую, пока условие изменяется, изменяется через 1-й цикл, и мне нужно, чтобы она была одинаковой для обоих петли. Вот код:Parallell while loop without using threads

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

Из комментария:

Я получаю письмо из строки и пытаюсь выяснить, какой путь короче, чтобы добраться до тех же букв в алфавите, отправляясь вперед или назад. Я использую циклический двойной список.

Похоже, вы просто хотите один while цикла с двумя tmp указателями:

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 не достигнет его. Но, может быть, с || inread & & it это сработает.Спасибо –

+0

@niksrb Цикл будет работать, пока ни tmp1, ни tmp2 не достигнут цели. Если tmp1 достигает первого, то продвижение вперед - это самый короткий путь. Это нашло результат, поэтому после этого не нужно продолжать. Условие 'while' является правильным для заданной задачи. – Oktalist

0

Нет это невозможно без резьбы (или вы можете использовать межпроцессный, но я предполагаю, что это не ваша точка)

можно избежать с помощью «ручного» многопоточности, хотя с std::future и std::async

Вы можете сделать каждый с нить поиск функции, как это:

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 будет блокироваться, пока нити не выполняются. Но они будут работать параллельно.

В вашем случае в зависимости от размера строки/алфавита и алгоритма, хотя я сомневаюсь, что вы получите много пользы от этого в нескольких потоках. Накладные расходы могут занимать больше времени, чем весь расчет, поэтому вы должны измерить, может ли это ускорить выполнение этой однопоточной.