1

CreateThread()の使用を少し見栄えよくする小さなコードを書こうとしています。本当に使うつもりだとは言えませんが、私のような新しいプログラマーにとっては、楽しくて小さなプロジェクトになると思いました。これが私がこれまでに持っているものです:

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

void _noarg_thread_create( void(*f)() )
{
    cout << "Thread created...\n" << endl;
    Sleep(10);
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)f, NULL, 0, NULL);
}

template <typename T>
void _arg_thread_create( void(*f)(T), T* parameter)
{
    cout << "Thread created...\n" << endl;
    Sleep(10);  
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)*f, parameter, 0, NULL); 
}


void printnums(int x)
{
    for(int i = x; i < 100; i++)
    {
        cout << i << endl;
    }
}

void printnumsnoarg()
{
    for(int i = 0; i < 100; i++)
    {
        cout << i << endl;
    }
}


int main()
{
    cin.get();
    _noarg_thread_create( &printnumsnoarg );
    cin.get();
    int x = 14;
    _arg_thread_create( &printnums, &x );
    cin.get();
}

基本的に、CreateThreadの2つの異なるプリセットを呼び出す2つの関数があります。1つはスレッドでパラメーターが必要な場合、もう1つはスレッドでパラメーターが不要な場合です。これはg++コンパイラ(cygwin)でコンパイルでき、エラーなしで実行されます。最初のスレッドは適切に作成され、期待どおりに0〜99の数字が出力されます。ただし、2番目のスレッドは数値を出力しません(このコードでは、14〜99を出力する必要があります)。私の出力は次のようになります。

<start of output> 

$ ./a.exe

Thread created...

0     
1
2   
3
.
.
.        
97
98   
99


Thread Created...



<end of output>

2番目のスレッドが正しく機能しない理由はありますか?

4

1 に答える 1

1

実際には、関数へのポインターを渡しているのを見逃しているようですprintnums(int x)。main関数のの格納場所はx100よりもはるかに大きくなるため、ループは実行されません。

次のように変更してみてくださいprintnums

void printnums(int *x)
{
    for(int i = *x; i < 100; i++)
    {
        cout << i << endl;
    }
}

そうすれば、すべてが期待どおりに機能すると思います。

于 2013-03-05T21:22:58.967 に答える