3

みんな私は1つのソート方法を考えています、それはスリープソートと呼ばれます

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int c, char **v)
{
    while (--c > 1 && !fork());
    sleep(c = atoi(v[c]));
    printf("%d\n", c);
    wait(0);
    return 0;
}

私は1つのことを理解していません.C ++ 11でフォークに相当するものは何ですか?私はC ++の新しいバージョンを意味しましたか?私はこのような待機関数を書くことができました

void wait ( int seconds ){
    clock_t endwait;
    endwait = clock () + seconds * CLOCKS_PER_SEC ;
    while (clock() < endwait) {}
}

しかし、fork() はどうですか? 私は次のコードを試しました

#include<iostream>
#include<time.h>
using namespace std;;

void wait ( int seconds ){
    clock_t endwait;
    endwait = clock () + seconds * CLOCKS_PER_SEC ;
    while (clock() < endwait) {}
}

void Sort(int c,int a[])
{
    while(--c>1)
    {
        wait(c=a[c]);
        cout<<c<<"  ";
    }
 }

int main()
{
    int a[]={1, 3, 2, 11, 6, 4};
    int c=5;
    Sort(c,a);
    wait(0);

    return 0;
}

しかし、ソートされた出力が得られず、6 4 1のように出力されて終了するので、修正方法を教えてください。

4

5 に答える 5

3

wait()関数のように単純に遅延させることはできません。これは、引数ごとに(を介して)新しいプロセスを作成し、fork()各引数を並行してスリープさせることによって機能します。あなたの提案では、各要素が連続してスリープするため、ある種の錯覚を与えることはありません。

--fork what is fork equivalent in c++ 11?()はCまたはC++に固有のものではありません。これは、オペレーティングシステムが提供する機能です。

于 2012-09-07T20:32:58.427 に答える
1

話すべきことはまだたくさんありますが、私はあなたの主な質問に答えるだけです。

c=56つの数値がありますが、設定しましたwhile(--c>1)。計算すると、ループは3回しか実行されません。--これは、演算子の前にbeforeを追加すると、最初に1を減算してから、比較するためです。

  • c=5
  • while(--c>1)[5の1を減算=4し、1より大きいかどうかを確認します]//実行します
  • while(--c>1)[4の1を減算=3し、1より大きいかどうかを確認します]//実行します
  • while(--c>1)[3 = 2の1を減算し、1より大きいかどうかを確認します]//実行します
  • while(--c>1)[2 = 1の1を減算し、1より大きいかどうかを確認します]//実行しません

あなたはあなたが持っているc数の量に変更する必要があります:c=6、そして次のwhileようにループを変更します:while(c-->0)

于 2012-09-07T20:50:22.943 に答える
1

あなたはその要点を理解していません。待機は並行して実行する必要があります(forkによってトリガーされ、アイテムごとに新しいスレッドが作成されます)。

于 2012-09-07T20:33:26.570 に答える
0

Win32 を使用した C++ での実用的な実装を次に示します。

#include <windows.h>
#include <iostream>

using namespace std;

DWORD threadFunc(LPVOID param)
{
    long val = (long)param;
    Sleep((int)val * 1000);
    cout << val << " ";
    return 0;
}

int main()
{
    HANDLE handles[6];
    int arr[] = {1, 3, 2, 11, 6, 4};

    for(int i = 0; i < 6; i++)
    {
        handles[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&threadFunc, 
                                  (LPVOID)arr[i], 0, NULL);
    }

    WaitForMultipleObjects(6, handles, 1, INFINITE);
}
于 2012-09-07T21:47:52.930 に答える