如何打电话"加入()" C ++中另一个函数中一个线程的方法?

时间:2015-05-31 18:18:27

标签: c++ multithreading

我在main函数中创建了两个线程。我想调用" join()"另一个线程中的一个方法。

我怎么称呼?

我正在跑步"连接"和"发件人"作为两个帖子。现在我想打电话给#34;加入()"关于" connect"的方法" void ClientSocket :: sender()"中的线程方法

可以打电话吗?

这些是我作为两个线程运行的代码片段。

int  ClientSocket::Connect() 
{
    isConnected = connect(clientSock,      (LPSOCKADDR)&serverInfo,sizeof(serverInfo));

    return isConnected;
}

void ClientSocket::sender()
{

    if (isConnected == 0)
    {
send(clientSock, readBuffer.str().c_str(), strlen((char *)readBuffer.str().c_str()), 0);

    }
}

2 个答案:

答案 0 :(得分:0)

在所有函数之外定义线程处理程序,即将它们定义为全局。因此,它们可以在任何地方使用,您可以在所有其他功能中调用两者的join方法。

答案 1 :(得分:0)

这是一个代码示例:

#include <memory>
#include <thread>
#include <iostream>

std::shared_ptr<std::thread> connect_thread, sender_thread;

class ClinetSocket {
public:
    int Connect() {
        return true;
    }

    void sender() {
        connect_thread->join();
    }
};


int main() {
    ClinetSocket socket;

    connect_thread = std::make_shared<std::thread>([&socket] () {
        socket.Connect();
    });
    sender_thread = std::make_shared<std::thread>([&socket] () {
        socket.sender();
    });

    sender_thread->join();
    return 0;
}

但我认为更好的解决方案是使用某种事件:

#include <memory>
#include <thread>
#include <future>
#include <iostream>

class ClinetSocket {
public:
    int Connect() {
        connected_promice.set_value();
        return true;
    }

    void sender() {
        auto connected_future = connected_promice.get_future();
        connected_future.wait();
    }

private:
    std::promise<void> connected_promice;
};


int main() {
    ClinetSocket socket;

    std::thread connect_thread([&socket] () {
        socket.Connect();
    });
    std::thread sender_thread([&socket] () {
        socket.sender();
    });

    connect_thread.join();
    sender_thread.join();
    return 0;
}

全球变数是邪恶的。它们表明您在应用程序架构方面存在一些问题。