2016-10-28 23 views
0

(C++) スレッドを使用せずに2つの並列whileループを実行する可能性はありますか?私は1つのループの両方で、それらを次々に入れてみましたが、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'を保存して、セーブされたポインタを2番目のループに使用してみませんか? –

+0

また、ポインタを使うことを考えれば、ループ条件で逆参照する前に、 'tmp'がヌルポインタでないことを確認するべきでしょう。 –

答えて

1

コメントから:

私は、文字列から文字を取得し、アルファベットの同じ文字に到達するために短くなっているパスを見つけるためにしようと、つもりですが、前方または後方。私は周期的な二重リンクリストを使用しています。

あなたはちょうど2つのtmpのポインタを持つ1つの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

であなたは、各sは作ることができますがスレッド「マニュアル」を使用して回避することができ

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はスレッドが完了するまでブロックされますが、しかし、それらは並行して実行されます。

文字列/アルファベットとアルゴリズムのサイズによっては、複数のスレッドでこれを行うと多くのメリットが得られるのではないでしょうか。スレッドオーバーヘッドは計算全体よりも長くかかることがあるので、このシングルスレッドの方が速いかどうかを測定する必要があります。

関連する問題