Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在多线程程序中使用CURL安全吗?如何使其线程安全?_C++_Multithreading_Curl - Fatal编程技术网

C++ 在多线程程序中使用CURL安全吗?如何使其线程安全?

C++ 在多线程程序中使用CURL安全吗?如何使其线程安全?,c++,multithreading,curl,C++,Multithreading,Curl,我计划使用CURL与服务器通信。这种交流将作为一个单独的线程进行 我有一个curl包装器类,如下所示 如果我使用这个包装器类的对象与不同线程或同一线程中的不同服务器通信,那么它是线程安全的吗 下面的描述让我感到困惑 此函数不是线程安全的。当程序中的任何其他线程(即共享相同内存的线程)正在运行时,不能调用它。这不仅仅意味着没有其他线程使用libcurl。因为curl_global_init调用其他类似线程不安全的库的函数,所以它可能与使用这些库的任何其他线程冲突 有人能澄清一下混乱的情况吗 语言:

我计划使用CURL与服务器通信。这种交流将作为一个单独的线程进行

我有一个curl包装器类,如下所示

如果我使用这个包装器类的对象与不同线程或同一线程中的不同服务器通信,那么它是线程安全的吗

下面的描述让我感到困惑

此函数不是线程安全的。当程序中的任何其他线程(即共享相同内存的线程)正在运行时,不能调用它。这不仅仅意味着没有其他线程使用libcurl。因为curl_global_init调用其他类似线程不安全的库的函数,所以它可能与使用这些库的任何其他线程冲突

有人能澄清一下混乱的情况吗

语言:C++ 操作系统: 在开发中:OSX

在客户端:此代码将安装在客户端机器上,这意味着他们可以使用任何操作系统


谢谢

curl\u global\u init不是线程安全的,应该只在
int main之后调用一次{
是一个很好的位置Hi hanshenrik,谢谢你的回复。在这种情况下,我的构造函数和析构函数应该调用curl_easy_init并清理?。你是对的:),只需确保不让两个线程同时在同一个curl句柄上执行操作,并且easy_函数都是线程安全的。保持安全的一个可能方法是:不t在线程之间共享curl句柄我不能在我的设计中调用main中的curl\u global\u init。因为根据我的设计。main只调用接口(一些实现此接口的类使用不同的方式连接服务器,如curl、gsoap等)。应用程序是否要使用此项或其他项将在运行时决定。我不能在int main()之后立即调用此全局init{fine,有一个全局std::atomic_bool,其中false表示“未初始化”,true表示“已初始化”,wherin,如果它为false,您有一个独占互斥来初始化它,当您获得互斥时,您再次检查它是否为true,然后开始初始化,当它完成时,您将它设置为true并释放互斥,然后执行您应该执行的操作
class curlWrapper
 { 
private:
    CURLcode curlCode;
    CURL *curlHandle;
    struct curl_slist *header = NULL;
    MemoryStruct response;

public:
    curlWrapper(){        
        curl_global_init(CURL_GLOBAL_ALL);      

    }        
    ~curlWrapper(){
        curl_global_cleanup();            
    }

    CURL* curlInit();// curl_easy_init()
    CURLcode curlClose();// curl_easy_cleanUp()

    void initializeConnection();
    void sendRequest(const char* request);
    char* getResponse();
    void setMemorytoWrite();
    void listen();
    void closeConnection();
    void setURL(const char* url);
    void setHttpHeader(const char * contentType, const char * charSet);
    void setTrace(bool trace);// If true trace will be displayd
    void curlExec();

};`