Using std::thread to call functions from two Classes in C++11
I am trying to implement an API that should let the user create two communication channels in parallel. One channel uses TCP and the other uses UDP. I have two classes representing the two channels. These classes have different functions implemented. I would like the functions from the two channels to run in parallel. For that I am using std::thread
to create two threads, one for each channel (class).
The idea is the following following
The header file looks like
class Channel_1
{
public:
int myfunc(int a, int b);
};
class Channel_2
{
public:
int anotherfunc(int a, int b);
};
In the main cpp file
include the header file
int main()
{
int a = 10, b = 20;
Channel_1 ch1;
Channel_2 ch2;
std::thread t(ch1.myfunc, a,b);
return 0;
}
I get the error saying that no instance of the constructor std::thread
exists.
I have the following questions.
- Can't we call the functions from a class in the thread
constructor? - Does this idea of using threads for calling functions from different classes make sense?
c++ multithreading sockets c++11 stdthread
add a comment |
I am trying to implement an API that should let the user create two communication channels in parallel. One channel uses TCP and the other uses UDP. I have two classes representing the two channels. These classes have different functions implemented. I would like the functions from the two channels to run in parallel. For that I am using std::thread
to create two threads, one for each channel (class).
The idea is the following following
The header file looks like
class Channel_1
{
public:
int myfunc(int a, int b);
};
class Channel_2
{
public:
int anotherfunc(int a, int b);
};
In the main cpp file
include the header file
int main()
{
int a = 10, b = 20;
Channel_1 ch1;
Channel_2 ch2;
std::thread t(ch1.myfunc, a,b);
return 0;
}
I get the error saying that no instance of the constructor std::thread
exists.
I have the following questions.
- Can't we call the functions from a class in the thread
constructor? - Does this idea of using threads for calling functions from different classes make sense?
c++ multithreading sockets c++11 stdthread
add a comment |
I am trying to implement an API that should let the user create two communication channels in parallel. One channel uses TCP and the other uses UDP. I have two classes representing the two channels. These classes have different functions implemented. I would like the functions from the two channels to run in parallel. For that I am using std::thread
to create two threads, one for each channel (class).
The idea is the following following
The header file looks like
class Channel_1
{
public:
int myfunc(int a, int b);
};
class Channel_2
{
public:
int anotherfunc(int a, int b);
};
In the main cpp file
include the header file
int main()
{
int a = 10, b = 20;
Channel_1 ch1;
Channel_2 ch2;
std::thread t(ch1.myfunc, a,b);
return 0;
}
I get the error saying that no instance of the constructor std::thread
exists.
I have the following questions.
- Can't we call the functions from a class in the thread
constructor? - Does this idea of using threads for calling functions from different classes make sense?
c++ multithreading sockets c++11 stdthread
I am trying to implement an API that should let the user create two communication channels in parallel. One channel uses TCP and the other uses UDP. I have two classes representing the two channels. These classes have different functions implemented. I would like the functions from the two channels to run in parallel. For that I am using std::thread
to create two threads, one for each channel (class).
The idea is the following following
The header file looks like
class Channel_1
{
public:
int myfunc(int a, int b);
};
class Channel_2
{
public:
int anotherfunc(int a, int b);
};
In the main cpp file
include the header file
int main()
{
int a = 10, b = 20;
Channel_1 ch1;
Channel_2 ch2;
std::thread t(ch1.myfunc, a,b);
return 0;
}
I get the error saying that no instance of the constructor std::thread
exists.
I have the following questions.
- Can't we call the functions from a class in the thread
constructor? - Does this idea of using threads for calling functions from different classes make sense?
c++ multithreading sockets c++11 stdthread
c++ multithreading sockets c++11 stdthread
edited Nov 13 '18 at 14:12
JBL
9,71333667
9,71333667
asked Nov 13 '18 at 14:09
D_wanna_B_coderD_wanna_B_coder
195
195
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
You actually have two problems:
The syntax is wrong. You need to pass a pointer to the member function, as in
std::thread t(&Channel_1::myfunc, a, b);
Non-static member functions needs to be called on an instance of the class. This instance must be passed as the first argument:
std::thread t(&Channel_1::myfunc, ch1, a, b);
add a comment |
As Some programmer dude said, you need to supply a pointer to the function (either a static or non-static). A third option could be to make a base class that implements a start()
method that uses this thread constructor:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
Example using a lambda. It's not meant to be a complete working example, It's only meant to show how the third thread constructor could be used.
class thread_base {
private:
std::thread m_th;
bool m_terminated;
void proxy() {
// in the new thread
// add thread_base setup here if needed and
// call the execute() method in the derived class
execute();
}
public:
thread_base() : m_th(), m_terminated(false) {}
thread_base(const thread_base&) = delete;
thread_base& operator=(const thread_base&) = delete;
thread_base(thread_base&&) = default;
thread_base& operator=(thread_base&&) = default;
virtual ~thread_base() { join(); }
virtual void start() {
if(joinable()) throw std::runtime_error("thread already running");
else m_th = std::thread( [this] { proxy(); } );
}
inline bool joinable() { return m_th.joinable(); }
inline void join() { if(joinable()) { m_th.join(); m_terminated=false; } }
inline void terminate() { m_terminated=true; }
inline bool terminated() { return m_terminated; }
virtual void execute() = 0; // implement this in your derived classes
};
class Channel_1 : public thread_base {
void execute() {
// runs in a thread
// with a volontary check if a soft termination
// request has been issued
while( !terminated() ) {
// work
}
}
};
A virtual final member in the base class?
– SergeyA
Nov 13 '18 at 14:43
Yeah, it should be public and not possible to override. This was the first I thought of but perhaps there's a better way.
– Ted Lyngmo
Nov 13 '18 at 14:51
Is the downvote for thevirtual final
member or something else?
– Ted Lyngmo
Nov 13 '18 at 14:52
For virtual final method in base, for immediate core dump due to destructor of temporarystd::thread
called on non-joined thread, for unnecessary complexity.
– SergeyA
Nov 13 '18 at 14:55
Ok, it was not a complete working base class, but rather something to show how the third thread constructor could be used. I added a little more boilerplate (still not a complete base class though). As for thevirtual final
method, I don't know of another way of preventing it from being overridden.
– Ted Lyngmo
Nov 13 '18 at 15:22
|
show 1 more comment
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53282876%2fusing-stdthread-to-call-functions-from-two-classes-in-c11%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
You actually have two problems:
The syntax is wrong. You need to pass a pointer to the member function, as in
std::thread t(&Channel_1::myfunc, a, b);
Non-static member functions needs to be called on an instance of the class. This instance must be passed as the first argument:
std::thread t(&Channel_1::myfunc, ch1, a, b);
add a comment |
You actually have two problems:
The syntax is wrong. You need to pass a pointer to the member function, as in
std::thread t(&Channel_1::myfunc, a, b);
Non-static member functions needs to be called on an instance of the class. This instance must be passed as the first argument:
std::thread t(&Channel_1::myfunc, ch1, a, b);
add a comment |
You actually have two problems:
The syntax is wrong. You need to pass a pointer to the member function, as in
std::thread t(&Channel_1::myfunc, a, b);
Non-static member functions needs to be called on an instance of the class. This instance must be passed as the first argument:
std::thread t(&Channel_1::myfunc, ch1, a, b);
You actually have two problems:
The syntax is wrong. You need to pass a pointer to the member function, as in
std::thread t(&Channel_1::myfunc, a, b);
Non-static member functions needs to be called on an instance of the class. This instance must be passed as the first argument:
std::thread t(&Channel_1::myfunc, ch1, a, b);
answered Nov 13 '18 at 14:12
Some programmer dudeSome programmer dude
296k24250412
296k24250412
add a comment |
add a comment |
As Some programmer dude said, you need to supply a pointer to the function (either a static or non-static). A third option could be to make a base class that implements a start()
method that uses this thread constructor:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
Example using a lambda. It's not meant to be a complete working example, It's only meant to show how the third thread constructor could be used.
class thread_base {
private:
std::thread m_th;
bool m_terminated;
void proxy() {
// in the new thread
// add thread_base setup here if needed and
// call the execute() method in the derived class
execute();
}
public:
thread_base() : m_th(), m_terminated(false) {}
thread_base(const thread_base&) = delete;
thread_base& operator=(const thread_base&) = delete;
thread_base(thread_base&&) = default;
thread_base& operator=(thread_base&&) = default;
virtual ~thread_base() { join(); }
virtual void start() {
if(joinable()) throw std::runtime_error("thread already running");
else m_th = std::thread( [this] { proxy(); } );
}
inline bool joinable() { return m_th.joinable(); }
inline void join() { if(joinable()) { m_th.join(); m_terminated=false; } }
inline void terminate() { m_terminated=true; }
inline bool terminated() { return m_terminated; }
virtual void execute() = 0; // implement this in your derived classes
};
class Channel_1 : public thread_base {
void execute() {
// runs in a thread
// with a volontary check if a soft termination
// request has been issued
while( !terminated() ) {
// work
}
}
};
A virtual final member in the base class?
– SergeyA
Nov 13 '18 at 14:43
Yeah, it should be public and not possible to override. This was the first I thought of but perhaps there's a better way.
– Ted Lyngmo
Nov 13 '18 at 14:51
Is the downvote for thevirtual final
member or something else?
– Ted Lyngmo
Nov 13 '18 at 14:52
For virtual final method in base, for immediate core dump due to destructor of temporarystd::thread
called on non-joined thread, for unnecessary complexity.
– SergeyA
Nov 13 '18 at 14:55
Ok, it was not a complete working base class, but rather something to show how the third thread constructor could be used. I added a little more boilerplate (still not a complete base class though). As for thevirtual final
method, I don't know of another way of preventing it from being overridden.
– Ted Lyngmo
Nov 13 '18 at 15:22
|
show 1 more comment
As Some programmer dude said, you need to supply a pointer to the function (either a static or non-static). A third option could be to make a base class that implements a start()
method that uses this thread constructor:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
Example using a lambda. It's not meant to be a complete working example, It's only meant to show how the third thread constructor could be used.
class thread_base {
private:
std::thread m_th;
bool m_terminated;
void proxy() {
// in the new thread
// add thread_base setup here if needed and
// call the execute() method in the derived class
execute();
}
public:
thread_base() : m_th(), m_terminated(false) {}
thread_base(const thread_base&) = delete;
thread_base& operator=(const thread_base&) = delete;
thread_base(thread_base&&) = default;
thread_base& operator=(thread_base&&) = default;
virtual ~thread_base() { join(); }
virtual void start() {
if(joinable()) throw std::runtime_error("thread already running");
else m_th = std::thread( [this] { proxy(); } );
}
inline bool joinable() { return m_th.joinable(); }
inline void join() { if(joinable()) { m_th.join(); m_terminated=false; } }
inline void terminate() { m_terminated=true; }
inline bool terminated() { return m_terminated; }
virtual void execute() = 0; // implement this in your derived classes
};
class Channel_1 : public thread_base {
void execute() {
// runs in a thread
// with a volontary check if a soft termination
// request has been issued
while( !terminated() ) {
// work
}
}
};
A virtual final member in the base class?
– SergeyA
Nov 13 '18 at 14:43
Yeah, it should be public and not possible to override. This was the first I thought of but perhaps there's a better way.
– Ted Lyngmo
Nov 13 '18 at 14:51
Is the downvote for thevirtual final
member or something else?
– Ted Lyngmo
Nov 13 '18 at 14:52
For virtual final method in base, for immediate core dump due to destructor of temporarystd::thread
called on non-joined thread, for unnecessary complexity.
– SergeyA
Nov 13 '18 at 14:55
Ok, it was not a complete working base class, but rather something to show how the third thread constructor could be used. I added a little more boilerplate (still not a complete base class though). As for thevirtual final
method, I don't know of another way of preventing it from being overridden.
– Ted Lyngmo
Nov 13 '18 at 15:22
|
show 1 more comment
As Some programmer dude said, you need to supply a pointer to the function (either a static or non-static). A third option could be to make a base class that implements a start()
method that uses this thread constructor:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
Example using a lambda. It's not meant to be a complete working example, It's only meant to show how the third thread constructor could be used.
class thread_base {
private:
std::thread m_th;
bool m_terminated;
void proxy() {
// in the new thread
// add thread_base setup here if needed and
// call the execute() method in the derived class
execute();
}
public:
thread_base() : m_th(), m_terminated(false) {}
thread_base(const thread_base&) = delete;
thread_base& operator=(const thread_base&) = delete;
thread_base(thread_base&&) = default;
thread_base& operator=(thread_base&&) = default;
virtual ~thread_base() { join(); }
virtual void start() {
if(joinable()) throw std::runtime_error("thread already running");
else m_th = std::thread( [this] { proxy(); } );
}
inline bool joinable() { return m_th.joinable(); }
inline void join() { if(joinable()) { m_th.join(); m_terminated=false; } }
inline void terminate() { m_terminated=true; }
inline bool terminated() { return m_terminated; }
virtual void execute() = 0; // implement this in your derived classes
};
class Channel_1 : public thread_base {
void execute() {
// runs in a thread
// with a volontary check if a soft termination
// request has been issued
while( !terminated() ) {
// work
}
}
};
As Some programmer dude said, you need to supply a pointer to the function (either a static or non-static). A third option could be to make a base class that implements a start()
method that uses this thread constructor:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
Example using a lambda. It's not meant to be a complete working example, It's only meant to show how the third thread constructor could be used.
class thread_base {
private:
std::thread m_th;
bool m_terminated;
void proxy() {
// in the new thread
// add thread_base setup here if needed and
// call the execute() method in the derived class
execute();
}
public:
thread_base() : m_th(), m_terminated(false) {}
thread_base(const thread_base&) = delete;
thread_base& operator=(const thread_base&) = delete;
thread_base(thread_base&&) = default;
thread_base& operator=(thread_base&&) = default;
virtual ~thread_base() { join(); }
virtual void start() {
if(joinable()) throw std::runtime_error("thread already running");
else m_th = std::thread( [this] { proxy(); } );
}
inline bool joinable() { return m_th.joinable(); }
inline void join() { if(joinable()) { m_th.join(); m_terminated=false; } }
inline void terminate() { m_terminated=true; }
inline bool terminated() { return m_terminated; }
virtual void execute() = 0; // implement this in your derived classes
};
class Channel_1 : public thread_base {
void execute() {
// runs in a thread
// with a volontary check if a soft termination
// request has been issued
while( !terminated() ) {
// work
}
}
};
edited Nov 13 '18 at 17:28
answered Nov 13 '18 at 14:33
Ted LyngmoTed Lyngmo
2,1961317
2,1961317
A virtual final member in the base class?
– SergeyA
Nov 13 '18 at 14:43
Yeah, it should be public and not possible to override. This was the first I thought of but perhaps there's a better way.
– Ted Lyngmo
Nov 13 '18 at 14:51
Is the downvote for thevirtual final
member or something else?
– Ted Lyngmo
Nov 13 '18 at 14:52
For virtual final method in base, for immediate core dump due to destructor of temporarystd::thread
called on non-joined thread, for unnecessary complexity.
– SergeyA
Nov 13 '18 at 14:55
Ok, it was not a complete working base class, but rather something to show how the third thread constructor could be used. I added a little more boilerplate (still not a complete base class though). As for thevirtual final
method, I don't know of another way of preventing it from being overridden.
– Ted Lyngmo
Nov 13 '18 at 15:22
|
show 1 more comment
A virtual final member in the base class?
– SergeyA
Nov 13 '18 at 14:43
Yeah, it should be public and not possible to override. This was the first I thought of but perhaps there's a better way.
– Ted Lyngmo
Nov 13 '18 at 14:51
Is the downvote for thevirtual final
member or something else?
– Ted Lyngmo
Nov 13 '18 at 14:52
For virtual final method in base, for immediate core dump due to destructor of temporarystd::thread
called on non-joined thread, for unnecessary complexity.
– SergeyA
Nov 13 '18 at 14:55
Ok, it was not a complete working base class, but rather something to show how the third thread constructor could be used. I added a little more boilerplate (still not a complete base class though). As for thevirtual final
method, I don't know of another way of preventing it from being overridden.
– Ted Lyngmo
Nov 13 '18 at 15:22
A virtual final member in the base class?
– SergeyA
Nov 13 '18 at 14:43
A virtual final member in the base class?
– SergeyA
Nov 13 '18 at 14:43
Yeah, it should be public and not possible to override. This was the first I thought of but perhaps there's a better way.
– Ted Lyngmo
Nov 13 '18 at 14:51
Yeah, it should be public and not possible to override. This was the first I thought of but perhaps there's a better way.
– Ted Lyngmo
Nov 13 '18 at 14:51
Is the downvote for the
virtual final
member or something else?– Ted Lyngmo
Nov 13 '18 at 14:52
Is the downvote for the
virtual final
member or something else?– Ted Lyngmo
Nov 13 '18 at 14:52
For virtual final method in base, for immediate core dump due to destructor of temporary
std::thread
called on non-joined thread, for unnecessary complexity.– SergeyA
Nov 13 '18 at 14:55
For virtual final method in base, for immediate core dump due to destructor of temporary
std::thread
called on non-joined thread, for unnecessary complexity.– SergeyA
Nov 13 '18 at 14:55
Ok, it was not a complete working base class, but rather something to show how the third thread constructor could be used. I added a little more boilerplate (still not a complete base class though). As for the
virtual final
method, I don't know of another way of preventing it from being overridden.– Ted Lyngmo
Nov 13 '18 at 15:22
Ok, it was not a complete working base class, but rather something to show how the third thread constructor could be used. I added a little more boilerplate (still not a complete base class though). As for the
virtual final
method, I don't know of another way of preventing it from being overridden.– Ted Lyngmo
Nov 13 '18 at 15:22
|
show 1 more comment
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53282876%2fusing-stdthread-to-call-functions-from-two-classes-in-c11%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown