Parallell while循环而不使用线程

时间:2016-10-28 11:42:12

标签: c++ while-loop

(C ++) 是否有可能在不使用线程的情况下运行两个并行的while循环?我已经尝试将它们一个接一个地放在一个for循环中,但它对我不起作用,因为我在条件中使用的变量在第一个循环中被改变了,我需要它们对于两个都是相同的循环。 这是代码:

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

2 个答案:

答案 0 :(得分: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;
    }       
}

答案 1 :(得分:0)

如果没有线程,这是不可能的(或者你可以使用进程间但我想这不是你的意思)

您可以使用std::futurestd::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将阻塞,直到线程完成。但它们会并行运行。

在你的情况下,取决于字符串/字母表和算法的大小,但我怀疑你在多线程中做这件事会带来很多好处。线程开销可能需要比整个计算更长的时间,因此您应该测量这种单线程是否更快。