C ++简单线程与参数(no .net)

我已经search了一段时间的互联网,并find了不同的解决scheme,但都没有真正的工作,或为我的使用复杂。 我在2年前使用了C ++,所以它可能有点生疏:D

我目前正在编写一个将数据发布到URL的程序。 它只发布数据没有别的。 为了发布我使用curl的数据,但是它阻塞了主线程,当第一篇文章仍在运行时,会有第二篇文章开始。 最后大约有5-6个岗位同时运作。

现在我想用curl把post推到另一个线程。 每个post一个线程。 线程应该得到一个string参数,内容是什么推送。

我目前坚持这一点。 尝试WINAPI的窗口,但读取参数崩溃。 (第二个线程仍在我的示例中运行,而主线程结束(等待系统(“暂停”))。

有一个多平台解决scheme将是很好的,因为它将运行在Windows和Linux下!

inheritance人我现在的代码:

#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; } 

有没有人有build议?

谢谢您的帮助!

为线程使用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(); } } 

考虑使用Boost.Thread或新的C ++ 11线程工具 (如std::thread等)。

对最初问题的代码的一些评论:

  • 如果远离std :: thread或boost :: thread,请使用_beginthreadex(..)而不是CreateThread(..),因为后者如果与C运行时的某些函数一起使用,可能会导致资源泄漏。

  • 当使用CreateThread(..)时 ,如果传递函数的签名是正确的,则不需要LPTHREAD_START_ROUTINELPTHREAD_START_ROUTINE 。 所以铸造它是完全错误的。

  • 已经有关于堆栈分配变量的生命周期的一些评论,如果这些地址被传递给一个线程函数会发生什么。

  • 不要使用system("PAUSE")来保持代码的可移植性。 而是使用下面的代码片段:

     void wait_for_key_press()
     {
        的std :: cin.clear();
        的std :: cin.ignore(标准:: cin.rdbuf() - > in_avail());
        的std :: cin.get();
     }

您可能想要通过使用libcurl的多操作接口来避免多线程,这使您可以在同一(单个)线程中运行多个并发HTTP请求。