[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Multithreading with libssh
[Thread Prev] | [Thread Next]
- Subject: Multithreading with libssh
- From: Simon Moselewski <s.moselewski@xxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Thu, 26 Sep 2019 11:09:03 +0000
- To: "libssh@xxxxxxxxxx" <libssh@xxxxxxxxxx>
Hi everyone, I am using libssh to connect to a remote host, run commands on it and read the results. Since I am doing this for 1500 commands I want to use threads to parallelize that. I am using gcc compiler with flags -libssh -pthread and -lssh_threads. My threadless approach was: open session repeat 1500 times { open channel run remote command close channel } close session I read in the docu, that sessions cannot be shared over multiple threads, so with the threadful approach I do it differently: repeat 1500 times { open session open channel run remote command close channel close session } The threadful programm takes longer than my threadless approach so I guess something with the threading is not working correctly. I am very inexperienced with threads and would need some help here. Thanks in advance for any hints!!! Regards Simon My threadful code (shortened): ssh_threads_set_callbacks(ssh_threads_get_pthread()); ssh_init(); std::mutex mutex; std::vector<std::future<void>> tasks; tasks.reserve(16); for (list<Metric>::iterator it = metrics.begin(); it != metrics.end(); it++) { Metric metric = *it; tasks.emplace_back(std::async(std::launch::async, [&ip, &user, &pw, metric, i, &mutex]() { std::lock_guard<std::mutex> lock(mutex); try { ssh_session session = ssh_new(); ssh_options_set(session, SSH_OPTIONS_HOST, IP); rc = ssh_userauth_password(session, USERNAME, PASSWORD); ssh_channel channel = ssh_channel_new(session); rc = ssh_channel_open_session(channel); rc = ssh_channel_request_exec(channel, COMMAND); // get output char buffer[32] = {0}; int nbytes; nbytes = ssh_channel_read(channel, buffer, sizeof(buffer)-1, 0); ssh_channel_send_eof(channel); //get exit code int exitCode = -1; exitCode = ssh_channel_get_exit_status(channel); ssh_channel_close(channel); ssh_channel_free(channel); ssh_disconnect(session); ssh_free(session); } catch(...) { //something } })); } std::for_each(std::begin(tasks), std::end(tasks), [](auto& task) { task.get(); }); std::cout << "Done.\n"; ssh_finalize();
Re: Multithreading with libssh | g4-lisz@xxxxxxxxxxxx |
Re: Multithreading with libssh | Nick Burrett <nick@xxxxxxxxxx> |