2

私はしばらくの間インターネットを検索し、さまざまな解決策を見つけましたが、すべてが実際には機能しないか、私の使用には複雑です。私は2年前までC++を使用していたので、少し錆びているかもしれません:D

私は現在、URLにデータを投稿するプログラムを書いています。データを投稿するだけです。データを投稿するためにcurlを使用しますが、メインスレッドがブロックされ、最初の投稿がまだ実行されている間に、開始する必要のある2番目の投稿があります。最終的には、約5〜6のポスト操作が同時に実行されます。

次に、curlを使用した投稿を別のスレッドにプッシュします。投稿ごとに1つのスレッド。スレッドは、何をプッシュするかを含む文字列パラメーターを取得する必要があります。

私は現在これに固執しています。Windows用のWINAPIを試しましたが、パラメータの読み取り時にクラッシュします。(私の例では、メインスレッドが終了している間(system( "pause")で待機中)、2番目のスレッドはまだ実行されています)。

WindowsとLinuxで実行されるため、マルチプラットフォームソリューションがあると便利です。

これが私の現在のコードです:

#define CURL_STATICLIB
#include <curl/curl.h>
#include <curl/easy.h>
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#if defined(WIN32)
    #include <windows.h>
#else
    //#include <pthread.h>
#endif

using namespace std;

void post(string post) { // Function to post it to url
    CURL *curl; // curl object
    CURLcode res; // CURLcode object
    curl = curl_easy_init(); // init curl
    if(curl) { // is curl init
        curl_easy_setopt(curl, CURLOPT_URL, "http://10.8.27.101/api.aspx"); // set url
        string data = "api=" + post; // concat post data strings
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str()); // post data
        res = curl_easy_perform(curl); // execute
        curl_easy_cleanup(curl); // cleanup
    } else {
        cerr << "Failed to create curl handle!\n";
    }
}

#if defined(WIN32)
    DWORD WINAPI thread(LPVOID data) { // WINAPI Thread
        string pData = *((string*)data); // convert LPVOID to string [THIS FAILES]
        post(pData); // post it with curl
    }
#else
    // Linux version
#endif

void startThread(string data) { // FUnction to start the thread
    string pData = data; // some Test
    #if defined(WIN32)
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, &pData, 0, NULL); // Start a Windows thread with winapi
    #else
        // Linux version
    #endif
}

int main(int argc, char *argv[]) {
    // The post data to send
    string postData = "test1234567890";
    startThread(postData); // Start the thread
    system("PAUSE"); // Dont close the console window
    return EXIT_SUCCESS;
}

誰か提案がありますか?

助けてくれてありがとう!

4

3 に答える 3

3

Boost.Threadまたは新しいC++11スレッド機能(など)の使用を検討してくださいstd::thread

最初の質問のコードに対するいくつかの注意:

  • std::threadまたはboost::threadから離れている場合は、 CreateThread(.. )の代わりに_beginthreadex(..)を使用してください。後者は、Cランタイムの特定の関数で使用するとリソースリークを引き起こす可能性があるためです。

  • CreateThread(..)を使用LPTHREAD_START_ROUTINEする場合、渡された関数のシグネチャが正しければ、キャスト先は必要ありません。だからそれをキャストするのは単に間違っています。

  • スタックに割り当てられた変数の存続期間と、これらのアドレスがスレッド関数に渡された場合にどうなるかについては、すでにいくつかの意見がありました。

  • system("PAUSE")コードを保護するために使用しないでください。代わりに、次のスニペットを使用してください。

    void wait_for_key_press()
    {{
        std :: cin.clear();
        std :: cin.ignore(std :: cin.rdbuf()-> in_avail());
        std :: cin.get();
    }
于 2012-09-01T21:38:49.433 に答える
1

std::threadスレッドに使用します。これは比較的新しいものであり、最新のC ++ 11標準の一部ですが、近い将来、スレッドを実行するための最も移植性の高い方法になるでしょう。

ビジーウェイトになる5つのスレッドを作成するのがいかに簡単かをご覧ください(コンパイラーによって最適化されていない場合)。

#include<thread>
#include<vector>

int main()
{
    std::vector<std::thread> threads;
    for (int i=0; i< 5; i++)
    {
         threads.push_back(std::thread([] () {
              for (long long j=0; j < 1000000000000LL; j++) ;
         }));
    }

    for (auto & thread : threads)
    {
         thread.join();
    }
}
于 2012-09-01T21:38:52.710 に答える
1

libcurlマルチオペレーションインターフェイスを使用してマルチスレッドを回避することをお勧めします。これにより、同じ(単一の)スレッドで複数の同時HTTPリクエストを実行できます。

于 2012-09-01T21:44:57.010 に答える