tag:blogger.com,1999:blog-31416486271898405392024-03-25T12:44:11.443+05:30Tech Sujhav vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.comBlogger109125tag:blogger.com,1999:blog-3141648627189840539.post-27793868547871070142023-07-23T16:23:00.007+05:302023-08-07T16:43:25.607+05:30Priority Queue with FIFO <p style="text-align: justify;"><span style="font-size: medium;"><span style="font-family: courier;"><b>std::priority_queue</b> is one of the commonly used container but with limitation that it does not follow the FIFO once multiple- elements of same priority are pushed into the queue. Because of its underline algorithm HEAP with random access container, </span><span style="font-family: courier;">Therefore sometime notified as std::priority_queue is not FIFO (First In First Out)</span></span></p><p style="text-align: justify;"><span style="font-family: courier; font-size: medium;">Solution:: </span></p><p style="text-align: justify;"><span style="font-family: courier; font-size: medium;">One solution that we are going to discuss it here today is implementation for priority queue with the help of std::multiset<DATA>. Because std::multiset stores the data in sorted order to KEY, and this KEY shall act priority indicator.</span></p><p style="text-align: left;"><span style="color: red; font-family: courier; font-size: large;"><b>Let's first check the <u>problem</u> with std:: priority_queue</b></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td colspan="2" style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">#include <iostream></span></p><span style="font-family: courier;">#include <string> <br />#include <queue> <br />#include <map> <br /><br />using namespace std; <br /><br />class Person <br />{ <br /><span> </span>int m_age, m_priority; <br /><span> </span>char m_gender; <br /><span> </span>string m_name; <br />public: <br /><span> </span>Person(string a_name,int a_age,char a_gender) <br /><span> </span>{ <br /><span> </span><span> </span>m_name=a_name; <br /><span> </span><span> </span>m_gender=a_gender; <br /><span> </span><span> </span>m_age=a_age; <br /><span> </span><span> </span>if(m_age >= 60) <br /><span> </span><span> </span><span> </span>m_priority=1; <br /><span> </span><span> </span>else <br /><span> </span><span> </span><span> </span>m_priority=2; <br /><span> </span>} <br /><span> </span><b><span style="color: #2b00fe;">//to sort on priority </span></b><br /><span> </span>bool operator<( const Person& a_pObj ) const <br /><span> </span>{ <br /><span> </span><span> </span>return (m_priority > a_pObj.m_priority); <br /><span> </span>} <br /><span> </span>void ProcessTicket() <br /><span> </span>{ <br /><span> <span> </span></span>cout<<m_name<<", "<<m_age<<", "<<m_gender<<", "<<m_priority <<endl; <br /><span> </span>}<br />}; <br />int main() <br />{ <br /><span> </span>std::priority_queue<Person> l_ticketQueue; <br /><br /> <span> </span><b><span style="color: #2b00fe;">//1st Person put on Queue </span></b><br /><span> </span>l_ticketQueue.push(Person("Mohan",65,'M')); <br /><span> </span><span style="color: #2b00fe;"><b>//2nd Person put on Queue </b></span><br /><span> </span><span style="background-color: #fcff01;">l_ticketQueue.push(Person("RAM",44,'M')); </span><br /><span> </span><b><span style="color: #2b00fe;">//3rd Person put on Queue </span></b><br /><span> </span><span style="background-color: #fcff01;">l_ticketQueue.push(Person("Ramesh",40,'M')); </span><br /><span> </span><span style="color: #2b00fe;"><b>//4th Person put on Queue </b></span><br /><span> </span>l_ticketQueue.push(Person("Mohini",36,'F')); <br /><br /> <span> </span>while(!l_ticketQueue.empty()) <br /><span> </span>{ <br /><span> </span><span> </span>Person l_personInFront= l_ticketQueue.top(); <br /><span> </span><span> </span>l_personInFront.ProcessTicket(); <br /><span> </span><span> </span>l_ticketQueue.pop(); <br /><span> </span>} <br />} <br /></span><br />
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 205.3pt;" valign="top" width="274">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b>Output</b><o:p></o:p></p>
</td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 317.5pt;" valign="top" width="423">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b>Explanation</b><o:p></o:p></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 205.3pt;" valign="top" width="274">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><br /></p><span style="font-family: courier;">Mohan, 65, M, 1 <br /><span style="background-color: #fcff01;">Ramesh, 40, M, 2 </span><br /><span style="background-color: #fcff01;">Ram, 44, M, 2 </span><br />Mohini, 36, F, 2<br /></span><br />
</td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 317.5pt;" valign="top" width="423">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: times;">From the output is very much clear that priority_queue doesn’t follow
FIFO. Because Ramesh was 3<sup>rd</sup>
in the queue but it came before Ram and both having same priority i.e. (2).</span><o:p></o:p></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: times;">This happened because std::priority_queue uses HASH to store data.</span></p>
</td>
</tr>
</tbody></table><p style="text-align: justify;"><b style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: left;"><br /></b></p><span style="color: red; font-family: courier; font-size: x-large;"><b>Solution: Implementation of priority queue using std::multiset</b></span><span style="font-family: courier;"><br /><br /><span style="font-size: medium;">Here we have written a generic thread safe priorityQueue class that can be altered as per your requirement. Hope it shall help you.<b> Please do suggest if you have better way to implement below priorityQueue class</b>.</span></span><div><span style="font-family: courier; font-size: medium;"><br /></span></div><div><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td colspan="2" style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"><br /></span></p><span style="font-family: courier;">#include <iostream> <br />#include <set> <br />#include <mutex> <br />#include <condition_variable> <br />#include <thread> <br /><br /><b><span style="color: #2b00fe; font-size: medium;">//Generic thread-safe Priority Queue Class {Read-to-use}<br /></span><span style="color: #2b00fe; font-size: medium;">//With functions to put ITEM in queue and get ITEM from Queue</span></b><br /><i><b>template<class DATA> <br />class priorityQueue <br />{ <br /><span> </span>std::multiset<DATA> m_queue; <br /><span> </span>std::mutex m_lock; <br /><span> </span>std::condition_variable m_cv; <br />public: <br /><span> </span>void putData(DATA a_data) <br /><span> </span>{ <br /><span> </span><span> </span>try <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span><span> </span>std::lock_guard<std::mutex> l_lockTaken(m_lock); <br /><span> </span><span> </span><span> </span><span> </span>m_queue.emplace(a_data);<br /> <span> </span><span> </span><span> </span>} <br /><span> </span><span> </span><span> </span>m_cv.notify_all(); <br /><span> <span> </span></span>} <br /><span> </span><span> </span>catch(std::exception& e) <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>std::cout<<"putData::Exception :: "<<e.what()<<std::endl; <br /><span> </span><span> </span><span> </span>throw; <br /><span> </span><span> </span>} <br /><span> </span><span> </span>catch(...) <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>std::cout<<"putData::Exception Caught "<<std::endl; <br /><span> </span><span> </span><span> </span>throw; <br /><span> </span><span> </span>} <br /><span> </span>} <br /><span> </span>DATA getData() <br /><span> </span>{ <br /><span> </span><span> </span>try <br /><span> </span><span> </span>{ <br /><span><span> </span><span> </span> </span>DATA l_Value; <br /><span> </span><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span><span> </span>std::unique_lock<std::mutex> l_lockTaken(m_lock); <br /><span> </span><span> </span><span> </span><span> </span>while(m_queue.empty()) <br /><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>m_cv.wait(l_lockTaken); <br /><span> </span><span> </span><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span><span> </span><span> </span>auto l_itr=m_queue.begin(); <br /><span> </span><span> </span><span> </span><span> </span><span> </span>l_Value=*l_itr; <br /><span> </span><span> </span><span> </span><span> </span><span> </span>m_queue.erase(l_itr); <br /><span> </span><span> </span><span> </span><span> </span>} <br /><span> </span><span> </span><span> </span>} <br /><span> </span><span> </span><span> </span>return l_Value; <br /><span> </span><span> </span>}<br /><span> </span><span> </span>catch(std::exception& e) <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>std::cout<<"getData ::Exception :: "<<e.what()<<std::endl; <br /><span> </span><span> </span><span> </span>throw; <br /><span> </span><span> </span>} <br /><span> </span><span> </span>catch(...) <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>std::cout<<"getData :: Exception Caught "<<std::endl; <br /><span> </span><span> </span><span> </span>throw; <br /><span> </span><span> </span>} <br /><span> </span>} <br />}; </b></i><br /><br /><b><span style="color: #2b00fe; font-size: medium;">//Class Person </span></b><br />using namespace std;<br />class Person <br />{ <br /><span> </span>int m_age, m_priority; <br /><span> </span>char m_gender; <br /><span> </span>string m_name; <br />public: <br /><span> </span>Person(){} <br /><span> </span>Person(string a_name,int a_age,char a_gender) <br /><span> </span>{ <br /><span> </span><span> </span>m_name=a_name; <br /><span> </span><span> </span>m_gender=a_gender; <br /><span> </span><span> </span>m_age=a_age; <br /><span> </span><span> </span>if(m_age >= 60) <br /><span> </span><span> </span><span> </span>m_priority=1; <br /><span> </span><span> </span>else <br /><span> </span><span> </span><span> </span>m_priority=2; <br /><span> </span><span> </span>} <br /><span> </span>//to sort on priority <br /><span> </span>bool operator<( const Person& a_pObj ) const <br /><span> </span>{ <br /><span> </span><span> </span>return (m_priority < a_pObj.m_priority); <br /><span> </span>} <br /><span> </span>void ProcessTicket() <br /><span> </span>{ <br /><span> </span><span> </span>cout<<m_name<<", "<<m_age<<", "<<m_gender<<", "<<m_priority <<endl; <br /><span> </span>} <br />}; <br /><br />int main() <br />{<br /><span> </span>priorityQueue<Person> l_ticketQueue; <br /><br /> <span> </span><span style="color: #2b00fe; font-size: medium;"><b>//1st Person put on Queue </b></span><br /><span> </span>l_ticketQueue.putData(Person("Mohan",65,'M')); <br /><span> </span><span style="color: #2b00fe; font-size: medium;"><b>//2nd Person put on Queue </b></span><br /><span> </span>l_ticketQueue.putData(Person("RAM",44,'M')); <br /><span> </span><span style="color: #2b00fe; font-size: medium;"><b>//3rd Person put on Queue </b></span><br /><span> </span>l_ticketQueue.putData(Person("Ramesh",40,'M')); <br /><span> </span><span style="color: #2b00fe;"><b>//4th Person put on Queue </b></span><br /><span> </span>l_ticketQueue.putData(Person("Mohini",36,'F')); <br /><span> </span>while(1) <br /><span> </span>{ <br /><span> </span><span> </span>Person l_personInFront= l_ticketQueue.getData(); <br /><span> </span><span> </span>l_personInFront.ProcessTicket(); <br /><span> </span>} <br /><span> </span>return 0; <br />}</span></td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"><b>Output<o:p></o:p></b></span></p>
</td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"><b>Explanation</b><o:p></o:p></span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">Mohan, 65, M, 1<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">RAM, 44, M, 2<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">Ramesh, 40, M, 2<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">Mohini, 36, F, 2<o:p></o:p></span></p>
</td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier; font-size: medium;">Here we can see from output that queue follows FIFO once same
priority(KEY) entries are found. Therefore RAM, RAMESH and MOHINI are in the
same order of their insertion.</span><o:p></o:p></p>
</td>
</tr>
</tbody></table></div><div><span style="font-family: courier; font-size: medium;"><br /></span><p style="text-align: justify;"><b style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: left;">Your Comments /Suggestions & Questions are always welcome. </b></p><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;">We would like to help you with best of our knowledge.</b></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><div style="font-size: 13.2px;"><b>So feel free to put Questions</b></div></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com1tag:blogger.com,1999:blog-3141648627189840539.post-6318041773107811662023-07-23T09:41:00.002+05:302023-07-23T09:47:57.050+05:30error: no match for ‘operator<’ (operand types are ‘const TASK’ and ‘const TASK’)<p style="text-align: justify;"><span style="font-family: courier;"><span style="font-size: medium;">This error usually comes once we try to make an OBJECT (of a
class/struct) as KEY to align data in a std::container. Because operand used
are not change and shall not change the value hence container makes it as </span><b style="font-size: large;">const. </b><span style="font-size: medium;"> So we are supposed to make our overloaded operator
function as </span><span style="color: red; font-size: x-large;"><b>constant member function</b></span></span><span style="font-family: courier; font-size: medium;">
like below.</span></p><p style="text-align: justify;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy2ffQzNAoGtO-0pa-em6GtZg4-R8zQigGHttfmFEAk8xb9UihpKgm30L0REKT83cbqs83EoSkUvsSHUbJWHRQ9hrPI-JlQYFasz8J3jhLVC-C49_73WD-1MjdAgrj0ejhzWLQ6RUkB6sM6WVPhVBEqG4X7XQBNKYkFiOkDt2hl6LSn-XfRnDIyEr1-ig/s550/no%20match%20for%20operator.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="78" data-original-width="550" height="56" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy2ffQzNAoGtO-0pa-em6GtZg4-R8zQigGHttfmFEAk8xb9UihpKgm30L0REKT83cbqs83EoSkUvsSHUbJWHRQ9hrPI-JlQYFasz8J3jhLVC-C49_73WD-1MjdAgrj0ejhzWLQ6RUkB6sM6WVPhVBEqG4X7XQBNKYkFiOkDt2hl6LSn-XfRnDIyEr1-ig/w400-h56/no%20match%20for%20operator.PNG" width="400" /></a></div><br /><span style="font-family: courier; font-size: medium;">Let's first check the problem with multiple std-containers.</span><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnRQJPz60AEcJmoVPJFpod-YIQL4OOxVnnG0IN0EJYG20EdNWDdP5jHkm_QcRvm2S5-sksYK3gJNA1inJmIcp_Mm1QdRm1-Fqee64C3N7VzJeqwneAVD3M-LlJa_2VVts1rEq0vRc_Lg1tG19zeYaOEwD3waGk2lu65t3oWgoMtmRcK8iHdh7v6oIuKjM/s1173/No%20match%20for%20operator%20issue.PNG" style="margin-left: 1em; margin-right: 1em;"></a><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><img border="0" data-original-height="419" data-original-width="1173" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnRQJPz60AEcJmoVPJFpod-YIQL4OOxVnnG0IN0EJYG20EdNWDdP5jHkm_QcRvm2S5-sksYK3gJNA1inJmIcp_Mm1QdRm1-Fqee64C3N7VzJeqwneAVD3M-LlJa_2VVts1rEq0vRc_Lg1tG19zeYaOEwD3waGk2lu65t3oWgoMtmRcK8iHdh7v6oIuKjM/w640-h229/No%20match%20for%20operator%20issue.PNG" style="margin-left: auto; margin-right: auto;" width="640" /></td></tr><tr><td class="tr-caption" style="text-align: center;"><b>no match for ‘operator<’ problem</b></td></tr></tbody></table><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnRQJPz60AEcJmoVPJFpod-YIQL4OOxVnnG0IN0EJYG20EdNWDdP5jHkm_QcRvm2S5-sksYK3gJNA1inJmIcp_Mm1QdRm1-Fqee64C3N7VzJeqwneAVD3M-LlJa_2VVts1rEq0vRc_Lg1tG19zeYaOEwD3waGk2lu65t3oWgoMtmRcK8iHdh7v6oIuKjM/s1173/No%20match%20for%20operator%20issue.PNG" style="margin-left: 1em; margin-right: 1em;"></a></div><br /><span style="color: red; font-family: courier; font-size: x-large;"><b>Solution</b></span><p></p><p style="text-align: justify;"></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje2i9pBZAqnsOJHLi0OYH1HzzzCKEhutdRO5ubh6zuNxMKHqcde6k8C9QRxIMxfZaxqt0dCsYKhMvitfzj2hVhpsVAFD_yBIWSERy_Qt2E7CLOllY4Ljsn1WPC5Lpn_6QjSvOG_xluB1MrlrYk9udS2sLrcjaYxSzPGLPGwx-BjNT3zJkCh5RDqfRW7Nk/s1171/No%20match%20for%20operator%20solution.PNG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="394" data-original-width="1171" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje2i9pBZAqnsOJHLi0OYH1HzzzCKEhutdRO5ubh6zuNxMKHqcde6k8C9QRxIMxfZaxqt0dCsYKhMvitfzj2hVhpsVAFD_yBIWSERy_Qt2E7CLOllY4Ljsn1WPC5Lpn_6QjSvOG_xluB1MrlrYk9udS2sLrcjaYxSzPGLPGwx-BjNT3zJkCh5RDqfRW7Nk/w640-h215/No%20match%20for%20operator%20solution.PNG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><b>no match for ‘operator<’ solution</b></td></tr></tbody></table><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;">We would like to help you with best of our knowledge.</b></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><div style="font-size: 13.2px;"><b>So feel free to put Questions</b></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-10256804979148187772023-06-30T11:02:00.004+05:302023-07-23T14:14:07.769+05:30Coding Best Practice - Loose Coupling <p style="text-align: justify;"><span style="font-family: courier;">In a programmer's life <span style="color: red; font-size: medium;">"<b>CHANGE is INEVITABLE</b>"</span>. This practice shall help you a lot if you want to reuse, maintain an existing code or modify/update an existing code.</span></p><p style="text-align: justify;"><span style="font-family: courier;"><b><span style="color: red; font-size: medium;">Let's try to understand with an example</span></b>. We have a simple program to access a student database as per requirement of school (i.e. class School). Here MySQL databased is used. Let's says School usually reads few information 10 times to perform certain operation and write some information 2 times on that database using MySQL read and write APIs.</span></p><p style="text-align: justify;"><span style="font-family: courier;">Now management has come to the decision that MySQL is not affordable, switch to oracle now. Programmer shall make an effort to change code as per new requirement and he/she will make change at-least (10 read & 2 write) places in the code. This is called tightly coupled code. There are chances that existing logic may be affected during modification of code.</span></p><p style="text-align: justify;"><span style="font-family: courier;"><b><span style="font-size: medium;"><span style="color: red;">TIGHTHLY-COUPLED CODE</span>:-</span> </b>Directly calling 3rd party Library or API,[any other class] from our main-logic code section</span></p><p style="text-align: justify;"><span style="font-family: courier;">If code would have been loosely-coupled with the help of Wrapper Class/Function then it would be easier, faster and economical to switch to oracle. Because code should be changed at 2-Places 1-Read API and 1 Write API</span></p><p style="text-align: justify;"><span style="font-family: courier;">Loose-Coupling provides flexibility to a Class [Layer of code] that if there is change in other class it should not impact much. </span></p><p style="text-align: justify;"><b style="font-family: courier;"><span style="font-size: medium;"><span style="color: red;">LOOSELY-COUPLED CODE:</span>-</span> No direct</b><span style="font-family: courier;"> Call of 3rd party Library or API,[any other class] from our main-logic code section. There are various ways to implement it some to them are shown below</span></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWg4lE1l_md57IQa9CV6f9DWzdwYJSZgwLV6yhrkSepME0uGewcedWV08RykAIED2y2tS5bsPGyWzaiaoMbszjE85KYxMU4y-wCpJn8xQXzB8xuXbMmkAvQsUD9o58M8_188kYFlOa_9qbnJtXSQtR61mF1OCD0RpEEV5jqmGo6hSmU3WYcut9Lbz0MGs/s817/LOOSE%20and%20Tight%20Coupling.PNG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="209" data-original-width="817" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWg4lE1l_md57IQa9CV6f9DWzdwYJSZgwLV6yhrkSepME0uGewcedWV08RykAIED2y2tS5bsPGyWzaiaoMbszjE85KYxMU4y-wCpJn8xQXzB8xuXbMmkAvQsUD9o58M8_188kYFlOa_9qbnJtXSQtR61mF1OCD0RpEEV5jqmGo6hSmU3WYcut9Lbz0MGs/w640-h164/LOOSE%20and%20Tight%20Coupling.PNG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Loose and Tight Coupling of code</td></tr></tbody></table><p style="text-align: justify;"><span style="font-family: courier;">Similarly, if we have one client-server application that is interacting over UPD and later we came with requirement that transport should be the TCP or HTTP then loosely coupled code is easier to manage.</span></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQpDPbpGwe2KPBkZIBIHBVqgVi7GxT3DIWdQ7e_Tf6cJx135BOSOfWfea-dqUc7aQxBwMWSOz2wsWYoUjvfrYUZywTw9bYZsFXwqelHNd3NA9LgPfHzZ7xEMRUw9vf6Xvod_frSSMEmN8Lzp3QKho6cGTB09ALTTrBy1F64lXHixB3KSyLZIRJo-AClgs/s816/TIGHT%20Coupling.PNG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="404" data-original-width="816" height="316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQpDPbpGwe2KPBkZIBIHBVqgVi7GxT3DIWdQ7e_Tf6cJx135BOSOfWfea-dqUc7aQxBwMWSOz2wsWYoUjvfrYUZywTw9bYZsFXwqelHNd3NA9LgPfHzZ7xEMRUw9vf6Xvod_frSSMEmN8Lzp3QKho6cGTB09ALTTrBy1F64lXHixB3KSyLZIRJo-AClgs/w640-h316/TIGHT%20Coupling.PNG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Replace UDP with TCP in loosely coupled code.</td></tr></tbody></table><br /><p style="text-align: justify;"><span style="color: red; font-family: courier; font-size: medium;"><b>Where loosely coupled code can be helpful?</b></span></p><p style="text-align: justify;"><span style="font-family: courier;">Following are some of the places where one should use loose coupling.</span></p><p style="text-align: justify;"></p><ul><li><span style="font-family: courier;">Once calling 3rd-Party APIs.</span></li><li><span style="font-family: courier;">While implementing any IPC mechanism in your project.</span></li><li><span style="font-family: courier;">Calling method of any other module of the same project.</span></li><li><span style="font-family: courier;">Calling transport layer (HTTP, UDP, SCTP etc.) related APIs in your project.</span></li><li><span style="font-family: courier;">Once trying to call database related APIs.</span></li><li><span style="font-family: courier;">If you have parsing of API such as parsing JSON, XML or any text format.</span></li><li><span style="font-family: courier;">and many more ....</span></li></ul><div><span style="font-family: courier;"><b>Let check with example Code.</b></span></div><p></p><p style="text-align: justify;"><span style="font-family: courier;"></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 297.45pt;" valign="top" width="365">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; text-align: center;"><span style="font-family: courier;"><b>Tightly Coupled Code</b><o:p></o:p></span></p>
</td>
<td style="border-left: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 276.4pt;" valign="top" width="342">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm; text-align: center;"><span style="font-family: courier;"><b>Loosely Coupled Code</b><o:p></o:p></span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 297.45pt;" valign="top" width="365">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">class Client</span></p><span style="font-family: courier;">{ <br />public: <br /><span> </span>connectToServer() <br /><span> </span>{ <br /><span> </span><span> </span><b><span style="color: #2b00fe;">//Create Linux UDP Socket </span></b><br /><span> </span>} <br /><span> </span>sendFirstMessage()<br /> <span> </span>{ <br /><span> </span><span style="color: #2b00fe;"><b>//Send Message Using Linux UDP APIs </b></span><br /><span> </span>} <br /><span> </span>sendHelloMessage() <br /><span> </span>{ <br /><span> </span><span style="color: #2b00fe;"><b>//Send Message Using Linux UDP APIs </b></span><br /><span> </span>} <br /><span> </span>sendReportMessage() <br /><span> </span>{ <br /><span> </span><b><span style="color: #2b00fe;">//Send Message Using Linux UDP APIs</span></b><br /> <span> </span>} <br /><span> </span>sendFeedBackMessage() <br /><span> </span>{ <br /><span> </span><b><span style="color: #2b00fe;">//Send Message Using Linux UDP APIs </span></b><br /><span> </span>}<br />};
</span></td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 276.4pt;" valign="top" width="342"><span style="font-family: courier;">class Client <br />{ <br />public: <br /> connectToServer() <br /> { <br /> <b><span style="color: red;">createSocket() </span></b><br /> }<br /> sendFirstMessage() <br /> { <br /> <span style="color: red;"><b>sendMessageOnSocket</b>() </span><br /> } <br /> sendHelloMessage() <br /> { <br /> <span style="color: red;"><b>sendMessageOnSocket</b>() </span><br /> } <br /> sendReportMessage() <br /> { <br /> <span style="color: red;"><b>sendMessageOnSocket</b>() </span><br /> } <br /> sendFeedBackMessage() <br /> { <br /> <span style="color: red;"><b>sendMessageOnSocket</b>() </span><br /> } <br /> <span style="color: red;"><b>createSocket</b>() </span><br /> { <br /> <span style="color: #2b00fe;"><b>//Create Linux UDP Socket </b></span><br /> } <br /> <span style="color: red;"><b>sendMessageOnSocket</b>() </span><br /> { <br /> <span style="color: #2b00fe;"><b> </b><b>//Send Message Using Linux UDP APIs </b></span><br /> } <br /><br />};<br />
</span></td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 297.45pt;" valign="top" width="365">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"><b>Explanation:</b></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"></p><ul><li><span style="font-family: courier;">If we want to change transport to TCP then we are supposed to touch/modify
every existing function.</span></li><li><span style="font-family: courier;">More function we touch/modify more effort is required, more chances
of inducing new bugs.</span></li></ul><p></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><o:p><span style="font-family: courier;"> </span></o:p></p>
</td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 276.4pt;" valign="top" width="342">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b style="font-family: courier;">Explanation:</b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"></p><ul><li><span style="font-family: courier;">If we want to change transport to TCP then we are supposed to only
two function.</span></li><li><span style="font-family: courier;">Less effort is required and less chance of introducing a new bug.</span></li></ul><p></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><o:p></o:p></p>
</td>
</tr>
</tbody></table><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><p style="text-align: justify;"><span style="font-family: courier;"></span></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br /></b></div><div style="font-size: 13.2px;"><b>So feel free to put Questions</b></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-13236699973766853932023-06-23T17:42:00.004+05:302023-07-11T18:44:12.629+05:30Thread Information Linux Commands.<p><span style="font-family: courier; font-size: medium;">Hi All</span></p><p><span style="font-family: courier; font-size: medium;">Here we are suggesting some of the Linux commands that shall be useful to get information about threads running in process. If you have some more commands then you can suggest them in comment section.</span></p><p><span style="font-family: courier; font-size: large;">Let's say we have process name "</span><b style="font-family: courier; font-size: large;">exeThread</b><span style="font-family: courier; font-size: large;">" that has thread implementation following command shall be helpful.</span></p><br /><span style="font-family: courier;"><span style="font-size: medium;">TechSujhav@ TS:~/thread$</span><b><span style="font-size: medium;"> ps -ef |grep exeThread </span> <span style="color: #2b00fe;">[To find process-Id]</span></b><br /><br /><span style="font-size: x-small;"> TechSujhav <b>22545</b> 21921 99 16:52 pts/13 00:00:09 ./exeThread<br />TechSujhav 22568 44966 0 16:52 pts/26 00:00:00 grep --color=auto exeThread</span></span><br /><br /> <br /><span style="font-family: courier;"><span style="font-size: medium;">TechSujhav@ TS:~/thread$ <b>top -H -p 22545</b></span><br /><br />top - 16:52:59 up 66 days, 7:53, 28 users, load average: 1.34, 0.51, 0.22<br />Threads: 3 total, 2 running, 1 sleeping, 0 stopped, 0 zombie<br />%Cpu(s): 3.1 us, 0.0 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st<br />KiB Mem : 19772300+total, 3364552 free, 1100208 used, 19325824+buff/cache<br />KiB Swap: 8388604 total, 8380144 free, 8460 used. 19517392+avail Mem<br /><br /><br /><b> PID</b> USER PR NI VIRT RES SHR S <b>%CPU</b> %MEM TIME+ COMMAND<br /><br />22546 TechSujhav 20 0 106304 1992 1840 R 99.9 0.0 0:28.24 exeThread<br />22548 TechSujhav 20 0 106304 1992 1840 R 99.7 0.0 0:28.24 exeThread<br />22545 TechSujhav 20 0 106304 1992 1840 S 0.0 0.0 0:00.00 exeThread<br /><br /></span><br /><br /><span style="font-family: courier;"><span style="font-size: medium;"> TechSujhav@ TS:~/thread$<b> ps -T -p 22545</b></span><br /><br /> PID SPID TTY TIME CMD<br /><br />22545 22545 pts/13 00:00:00 exeThread<br />22545 22546 pts/13 00:01:33 exeThread<br />22545 22548 pts/13 00:01:33 exeThread</span><div><span style="font-family: courier;"><br /></span></div><div><span style="font-family: courier;"><br /></span></div><br /><a href="https://www.techsujhav.com/2023/06/how-to-debug-threads-with-gdb-debugger.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;"> How to debug threads with GDB debugger</span></a><br /><div style="text-align: center;"><a href="https://www.techsujhav.com/p/threads.html"><b><span style="font-size: x-large;">Main Page</span></b></a></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/frequently-asked-interview-questions-on.html"><span style="font-size: medium;">Frequently Asked Interview Questions on Threads </span><b><span style="font-size: x-large;">::NEXT</span></b></a></div><div><div><br /></div><div><b style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></div><div><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br /></b></div><div style="font-size: 13.2px;"><b>So feel free to put Questions</b></div></div><div><br /><br /></div></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-61881317578466529662023-06-21T22:24:00.008+05:302023-06-21T22:27:40.635+05:30How to create insert and read map in map using std::map<p><span style="font-size: medium;"><span style="font-family: courier;">Let check how we can code for following image where there are 3 Maps placed inside one another. </span><span style="font-family: courier;">As we know Map as two elements 1.Key and 2.Data (mapped to key) here<b> data is nothing but an another map</b>.</span></span></p><span style="font-family: courier; font-size: medium;">typedef std::map<string,vector<string>> <b>InnerMostMap</b>;<br />typedef std::map<string,vector<string>>::iterator <b>InnerMostMapItr</b>;<br /><br />typedef std::map<string,InnerMostMap> <b>MidMap</b>;</span><div><span style="font-family: courier; font-size: medium;">typedef std::map<string,InnerMostMap>:: iterator <b>MidMapItr</b>;</span></div><div style="text-align: center;"><span style="font-family: courier; font-size: medium;">or </span></div><div><span style="font-size: medium;"><span style="font-family: courier;">std::map<string,</span><span style="font-family: courier;">std::map<string,vector<string>></span><span style="font-family: courier;">> </span><b style="font-family: courier;">MidMap</b><span style="font-family: courier;">;</span><span style="font-family: courier;"><br /><br />typedef std::map<string,MidMap> <b>OutMap</b>;<br />typedef std::map<string,MidMap>::iterator <b>OutMapItr</b>;</span></span></div><div style="text-align: center;"><span style="font-family: courier; font-size: large;">or</span></div><div><span style="font-family: courier;">std::map<string,</span><span style="font-family: courier;">std::map<string,</span><span style="font-family: courier;">std::map<string,vector<string>></span><span style="font-family: courier;">></span><span style="font-family: courier;">> </span><b style="font-family: courier;">OutMap</b></div><div><b style="font-family: courier;"><br /></b></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKcOB64R5Sri-bWxw2kmcpWShoVCth9r4JKd9-SHp6uw34_zgzIUdlG_btzwnrwXwhwey4Wm4t1jLrsZBy5uXFEaOLO2nBsJfM9U0k_svvmruQ2NHYtMPNp8umYYXjPx_Lm4mDbXR3HO0gVzORS6uu2AKX4kKvAez4yAM6_veDB1EIA5ionabBAomPPok/s912/MAP%20inside%20Map.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="553" data-original-width="912" height="389" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKcOB64R5Sri-bWxw2kmcpWShoVCth9r4JKd9-SHp6uw34_zgzIUdlG_btzwnrwXwhwey4Wm4t1jLrsZBy5uXFEaOLO2nBsJfM9U0k_svvmruQ2NHYtMPNp8umYYXjPx_Lm4mDbXR3HO0gVzORS6uu2AKX4kKvAez4yAM6_veDB1EIA5ionabBAomPPok/w640-h389/MAP%20inside%20Map.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Nested Map, [Map inside Map]<br /></td></tr></tbody></table><br /><div><br /></div><div><span style="font-family: courier; font-size: medium;"><b>Strategy to follow:</b></span></div><div><ul style="text-align: left;"><li><span style="font-family: courier;"><span style="font-size: medium;">If KEY is to be added for the first time in map then one can use directly use <b>map::insert()</b></span></span></li><li><span style="font-family: courier;"><span style="font-size: medium;">If KEY is already exist and then you want to add/modify the data against that key then</span></span></li><ul><li><span style="font-family: courier;"><span style="font-size: medium;">use <b>map::find()</b> to know at which place KEY exist in map</span></span></li><li><span style="font-family: courier;"><span style="font-size: medium;">then modify/update the data.</span></span></li></ul><li><span style="font-family: courier; font-size: medium;">It is very simple to use <b>auto</b> datatype rather <b>iterator.</b></span></li><li><span style="font-family: courier; font-size: medium;">Best practice is to use <b>try</b> and <b>catch.</b></span></li></ul><div><span style="font-family: courier; font-size: medium;">Let check following code to understand, <b>COPY</b>, <b>PASTE</b> on any online compiler & <b>RUN</b></span></div></div><div><span style="font-size: medium;"><br /></span></div><div><span style="font-family: courier; font-size: medium;"><b><span style="color: red;">NOTE:- </span></b>First check output of below code then come back to code again and focus of comments.</span></div><div><br /></div><div><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">#include<iostream></span></p><span style="font-family: courier;">#include<map> <br />#include<vector> <br />using namespace std; <br /><br />typedef std::map<string,vector<string>> <b>InnerMostMap</b>; <br />typedef std::map<string,vector<string>>::iterator <b>InnerMostMapItr</b>; <br /><br />typedef std::map<string,InnerMostMap> <b>MidMap</b>;<br />typedef std::map<string,InnerMostMap>:: iterator <b>MidMapItr</b>;<br /><br />typedef std::map<string,MidMap> <b>OutMap</b>;<br />typedef std::map<string,MidMap>::iterator <b>OutMapItr</b>; <br /><br /><b><span style="color: #2b00fe;">//g_completeMap is a a</span></b></span><b style="font-family: courier;"><span style="color: #2b00fe;">ctual </span></b><b style="font-family: courier;"><span style="color: #2b00fe;">map Object</span></b><span style="font-family: courier;"><b><span style="color: #2b00fe;"><br />//that we are going to fill and read</span></b><br />OutMap g_completeMap;<br /><br /><b><span style="color: #2b00fe;">//Function to iterate complete map <br />//and display values. i.e. read values from map</span></b><br />void display_map()<br />{<br /> for(auto l_outMapRowObj:g_completeMap ) <br /> { <br /> cout<<"OutMap Key:: "<<l_outMapRowObj.first<<endl; <br /> for(auto l_midMapRowObj:l_outMapRowObj.second ) <br /> {<br /> cout<<"\t MidMap Key::"<<l_midMapRowObj.first<<endl; <br /> for(auto l_innrMapRowObj:l_midMapRowObj.second ) <br /> { <br /> cout<<"\t\t InnerMap Key::"<<l_innrMapRowObj.first<<endl; <br /> for(auto l_vectorElement : l_innrMapRowObj.second ) <br /> { <br /> cout<<"\t\t\t Vector Value::"<<l_vectorElement<<endl; <br /> } <br /> } <br /> } <br /> } <br />}<br />int main() <br />{ <br /> try <br /> { <br /> <b><span style="color: #2b00fe;">//First Entry in Inner Most map </span></b><br /> std::vector<string> l_vector ; <br /> l_vector.push_back("First_Entry_Vector"); <br /> InnerMostMap l_innerMap; <br /> l_innerMap.insert(std::pair<string,vector<string>>("first_key_inner",l_vector)); <br /><br /> <b><span style="color: #2b00fe;">//First Entry in MidMap </span></b><br /> MidMap l_midMap;<br /> l_midMap.insert(std::pair<string,InnerMostMap>("first_key_mid",l_innerMap)); <br /><br /> <b><span style="color: #2b00fe;">//First entry in Actual OutMap </span></b><br /> g_completeMap.insert(std::pair<string,MidMap>("first_key_outer",l_midMap)); <br /><br /> <b><span style="color: #2b00fe;">//display Value- Check what is inserted in map.</span></b><br /> display_map(); <br /><span> </span><span> </span></span><b style="font-family: courier;"><span style="color: red;">//Check Output Now</span></b><span style="font-family: courier;"><br /> <b style="color: #2b00fe;"> </b><b><span style="color: #2b00fe;">//**********************************************************// </span><br /><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;">//Enter following New-Value in map on Existing KEY</span><br /><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;">//<i>first_key_outer</i>::<i>first_key_mid</i>::<i>first_key_inner</i>::[</span><span style="color: red;">Second_Entry_Vector</span><span style="color: #2b00fe;">] </span><br /><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;">// Means only entry to be added in already existing Vector </span><br /><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;">//**********************************************************// </span><br /></b><br /> <span> </span><span> </span>OutMapItr l_outMapItr; <br /><span> </span><span> </span>l_outMapItr=g_completeMap.find("first_key_outer"); <br /><span> </span><span> </span>if(l_outMapItr == g_completeMap.end()) <br /><span> </span><span> </span>{<br /> <span> </span><span> </span><span> </span>cout<<"first_key_outer not foud in MAP" <<endl; <br /><b><span style="color: #2b00fe;"><span> </span><span> </span><span> </span>//Write code here if we want to add new entry in <br /><span> </span><span> </span><span> </span>//outmap with new Key </span></b><br /><span> </span><span> </span>} <br /><span> </span><span> </span>else <br /><span> </span><span> </span>{ <br /><b><span style="color: #2b00fe;"><span> </span><span> </span><span> </span>//now we have reached to first_key_outer <br /><span> </span><span> </span><span> </span>//now go to second of first_key_outer <br /><span> </span><span> </span><span> //</span>i.e. (Value of first_key_outer) <br /><span> </span><span> </span><span> </span>//then in value reach to first_key_mid </span></b><br /><br /><span> </span><span> </span><span> </span>//Create Mid key iterator <br /><span> </span><span> </span><span> </span>MidMapItr l_midKeyItr; <br /><br /><b><span style="color: #2b00fe;"><span> </span><span> </span><span> </span>//with l_outMapItr->second reaches to MidMap<br /><span> </span><span> </span><span> </span>//with .find() looks for first_key_mid in MidMap </span></b><br /><span> </span><span> </span><span> </span>l_midKeyItr=(l_outMapItr->second).find("first_key_mid"); <br /><span><br /> </span><span> </span><span> </span>if(l_midKeyItr == (l_outMapItr->second).end()) <br /><span> </span><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span><span> </span><b><span style="color: #2b00fe;">//Key first_key_mid is not found </span></b><br /><span> </span><span> </span><span> </span>} <br /><span> </span><span> </span><span> </span>else <br /><span> </span><span> </span><span> </span>{ <br /><b><span style="color: #2b00fe;"><span> </span><span> </span><span> </span><span> </span>//first_key_mid is found <br /><span> </span><span> </span><span> </span><span> </span>//now go to second of first_key_mid <br /><span> </span><span> </span><span> </span><span> //</span>i.e. (Value of first_key_mid) <br /><span> </span><span> </span><span> </span><span> </span>//then in that Value (second)find for first_key_inner <br /><span> </span><span> </span><span> </span><span> <br /></span><span> </span><span> </span><span> </span><span> </span>//Create Inner Map iterator </span></b><br /><span> </span><span> </span><span> </span><span> </span>InnerMostMapItr l_innerMapItr; <br /><br /> <b><span style="color: #2b00fe;"><span> </span><span> </span><span> </span><span> </span>//with l_midKeyItr->second reaches to MidMap <br /><span> </span><span> </span><span> </span><span> </span>//with .find() looks for first_key_inner in MidMap </span></b><br /><span><span> </span> </span><span> </span><span> </span>l_innerMapItr=(l_midKeyItr->second).find("first_key_inner"); <br /><br /><span> </span><span> </span><span> </span><span> </span>if(l_innerMapItr == (l_midKeyItr->second).end()) <br /><span> </span><span> </span><span> </span><span> </span>{<br /><span> </span><span> </span><span> </span><span> </span><span> </span>//first_key_inner not found <br /><span> </span><span> </span><span> </span><span> </span>} <br /><span> </span><span> </span><span> </span><span> </span>else <br /><span> </span><span> </span><span> </span><span> </span>{ <br /><b><span style="color: #2b00fe;"><span> </span><span> </span><span> </span><span> </span><span> </span>//now go to first_key_inner value i.e Vector <br /><span> </span><span> </span><span> </span><span> </span><span> </span>//l_innerMapItr->second i.e. reaches to Vector <br /><span> </span><span> </span><span> </span><span> </span><span> </span>//Now push_back to put "Second_Entry_Vector" </span></b><br /><br /><span> </span><span> </span><span> </span><span> </span><span> </span>(l_innerMapItr->second).push_back("Second_Entry_Vector"); <br /><span> </span><span> </span><span> </span><span> </span>} <br /><span> </span><span> </span><span> </span>}<br /><span> </span><span> </span>} <br /><span> </span><span> </span><span>cout<<"*** </span><b><span style="color: red;">Second_Entry_Vector - inserted ***</span></b>"<<endl;<span><br /></span><span> </span><span> </span>display_map(); <br /><b><span style="color: red;"><span> </span><span> //Check Output Now</span></span></b><br /> <b><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;">//****************************************************// </span><br /><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;"> //</span><span style="color: #2b00fe;">Enter following Value in map </span><br /><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;">// first_key_outer::first_key_mid::</span><span style="color: red;"><u>second_key_inner</u></span><span style="color: #2b00fe;">::[first_Entry_Vector] </span><br /><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;">// Means only entry to be added in already existing Vector </span><br /><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;"> </span><span style="color: #2b00fe;">//*****************************************************// </span><br /></b><span> </span><span> </span>l_outMapItr=g_completeMap.find("first_key_outer"); <br /><span> </span><span> </span>if(l_outMapItr == g_completeMap.end()) <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>cout<<"first_key_outer not foud in MAP" <<endl; <br /><b><span style="color: #2b00fe;"><span> </span><span> </span><span> </span>//Write code here if we want to add new entry in <br /><span> </span><span> </span><span> </span>//outmap with new Key </span></b><br /><span> </span><span> </span>} <br /><span> </span><span> </span>else <br /><span> </span><span> </span>{ <br /><b><span style="color: #2b00fe;"><span> </span><span> </span><span> </span>//now we have reached to first_key_outer <br /><span> </span><span> </span><span> </span>//now go to second of first_key_outer <br /><span> </span><span> </span><span> //</span>i.e.(Value of first_key_outer)<br /> <span> </span><span> </span><span> </span>//then in value/data reach to first_key_mid <br /><br /> <span> </span><span> </span><span> </span>//Create Mid key iterator </span></b><br /><span> </span><span> </span><span> </span>MidMapItr l_midKeyItr; <br /><b><span style="color: #2b00fe;"><br /> <span> </span><span> </span><span> </span>//with l_outMapItr->second reaches to MidMap <br /><span> </span><span> </span><span> </span>//with .find() looks for first_key_mid in MidMap </span></b><br /><span> </span><span> </span><span> </span>l_midKeyItr=(l_outMapItr->second).find("first_key_mid"); <br /><span> </span><span> </span><span> </span>if(l_midKeyItr == (l_outMapItr->second).end()) <br /><span> </span><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span><span> </span>//Key first_key_mid is not found <br /><span> </span><span> </span><span> </span>} <br /><span> </span><span> </span><span> </span>else <br /><span> </span><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span><span> </span>//first_key_mid is found <br /><span> </span><span> </span><span> </span><span> </span>//now go to second of first_key_mid <br /><span> </span><span> </span><span> </span><span> //</span>i.e. (Value of first_key_mid) <br /><span> </span><span> </span><span> </span><span> </span>//then in that Value/Data (second)find for first_key_inner <br /><span> </span><span> </span><span> </span><span> </span><b><span style="color: #2b00fe;">//Create Inner Map iterator </span></b><br /><span> </span><span> </span><span> </span><span> </span>InnerMostMapItr l_innerMapItr; <br /><b><span style="color: #2b00fe;"><br /> <span> </span><span> </span><span> </span><span> </span>//with l_midKeyItr->second reaches to MidMap <br /><span> </span><span> </span><span> </span><span> </span>//with .find() looks for first_key_inner in MidMap </span></b><br /><span><span> </span><span> </span><span> </span> </span><span> </span>l_innerMapItr=(l_midKeyItr->second).find("second_key_inner"); <br /><br /><span> </span><span> </span><span> </span><span> </span>if(l_innerMapItr == (l_midKeyItr->second).end()) <br /><span> </span><span> </span><span> </span><span> </span>{<br /><b><span style="color: #2b00fe;"> //************************************/<br /> //</span><span style="color: red;">second_key_inner</span><span style="color: #2b00fe;"> not found <br /> //Create Vector to put at second_key_inner<br /></span></b></span><b><span style="color: #2b00fe;"> <span style="font-family: courier;">//</span><span style="font-family: courier;">**</span><span style="font-family: courier;">***********************************/</span></span></b><span style="font-family: courier;"><br /> <span> </span><span> </span><span> </span><span> </span><span> </span>std::vector<string> l_vector ; <br /><span> </span><span> </span><span> </span><span> </span><span> </span>l_vector.push_back("First_Entry_Vector"); <br /><span> </span><span> </span><span> </span><span> </span><span> </span>(l_midKeyItr->second).insert(std::pair<string,vector<string>>("second_key_inner",l_vector));; <br /><span> </span><span> </span><span> </span><span> }</span><br /><span> </span><span> </span><span> </span><span> </span>else <br /><span> </span><span> </span><span> </span><span> </span>{ <br /><b><span style="color: #2b00fe;"><span> </span><span> </span><span> </span><span> </span><span> </span>//now go to first_key_inner value i.e Vector <br /><span> </span><span> </span><span> </span><span> </span><span> </span>//l_innerMapItr->second i.e. reaches to Vector <br /><span> </span><span> </span><span> </span><span> </span><span> </span>//Now push_back to put "Second_Entry_Vector" <br /></span></b><br /> <span> </span><span> </span><span> </span><span> </span><span> </span>(l_innerMapItr->second).push_back("Second_Entry_Vector");<br /> <span> </span><span> </span><span> </span><span> </span>} <br /><span> </span><span> </span><span> </span>}<span> </span><span> </span><br /><span> </span><span> </span>} <br /></span><span> </span><span> </span> <span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"*** </span><b style="font-family: courier;"><span style="color: red;"><u>second_key_inner</u></span></b><b style="font-family: courier;"><span style="color: red;"> - inserted ***</span></b><span style="font-family: courier;">"<<endl;</span><span style="font-family: courier;"><br /></span><b style="font-family: courier;"><span style="color: red;"> //Check Output Now</span></b><br style="font-family: courier;" /><span style="font-family: courier;"> <span> </span><span> </span>display_map(); <br /><span> </span>} <br /><span> </span>catch(...) <br /><span> </span>{ <br /><span> </span><span> </span>cout<<"Exception "<<endl; <br /><span> </span>} <br />} <br /></span><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"> </p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><o:p><b> COMPILE:</b></o:p></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">g++ map.cpp –o map</span><o:p></o:p></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><o:p> </o:p></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><o:p><b> OUTPUT:</b></o:p></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">OutMap Key:: first_key_outer</span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> MidMap
Key::first_key_mid<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> InnerMap
Key::first_key_inner<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> Vector
Value::First_Entry_Vector<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">*** </span><b style="font-family: courier;"><span style="color: red;">Second_Entry_Vector - inserted ***</span></b></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">OutMap Key:: first_key_outer<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> MidMap
Key::first_key_mid<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> InnerMap
Key::first_key_inner<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> Vector
Value::First_Entry_Vector<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> Vector
Value::<b><span style="color: red;">Second_Entry_Vector</span></b><o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">*** </span><b style="font-family: courier;"><span style="color: red;"><u>second_key_inner</u></span></b><b style="font-family: courier;"><span style="color: red;"> - inserted ***</span></b></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">OutMap Key:: first_key_outer<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> MidMap
Key::first_key_mid<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> InnerMap
Key::first_key_inner<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> Vector
Value::First_Entry_Vector<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> Vector
Value::Second_Entry_Vector<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> InnerMap
Key::<b><span style="color: red;">second_key_inner</span></b><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;"> Vector
Value::First_Entry_Vector</span> </p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><o:p> </o:p></p>
</td>
</tr>
</tbody></table></div><div><br /></div><div><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br /></b></div><div style="font-size: 13.2px;"><b>So feel free to put Questions</b></div></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-48573753848529420962023-06-16T18:10:00.001+05:302023-07-11T18:44:26.561+05:30How to Call function with Reference Variable, Default Argument and Pointer Variable from thread. <p><span style="font-family: courier;"><span style="font-size: medium;"><b><span style="color: red;">Yes</span></b> it is possible to call a function with arguments from a thread object</span>.</span></p><p><span style="font-family: courier; font-size: medium;"><b>NOTE:(1)- <span style="color: red;">Arguments to thread function shall either be moved (</span><u style="color: red;"><i>std::move</i></u><span style="color: red;">) or </span><u style="color: red;"><i>call by value</i></u><span style="color: red;">. If we have any reference variable as a argument then it shall be called with </span><u style="color: red;"><i>std::ref</i></u><span style="color: red;"> or </span><u style="color: red;"><i>std::cref</i>.</u></b></span></p><p><span style="font-family: courier; font-size: medium;"><b>NOTE:(2)-<span style="color: red;"> Return value of function shall be ignored, as thread won't allow function to return value.</span></b> there are other methods to return value from thread like future and promise.</span></p><p><span style="font-family: courier; font-size: medium;"><b>NOTE:(3)-<span style="color: red;"> If the function have default argument and that default argument shall be passed explicitly to thread call (constructor). </span></b>Default Arguments shall be automatically deducted by compiler, shall generate following error. Or use Lambda function as a work around.</span></p><p><span style="font-family: courier; font-size: large;">Let check with an example.</span></p><p><span style="font-family: courier; font-size: large;"></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<span style="font-family: courier;">#include<iostream> <br />#include<thread> <br />using namespace std; <br /><br /><b><span style="color: #2b00fe;">//taskFunc with multiple Argument </span></b><br />void taskFunc(int arg1, int* arg2, int& arg3, bool defaultArg=true) <br />{ <br /><span> </span>cout<<"called:: taskFunc(int arg1, int* arg2, int& arg3,bool defaultArg=true)"<<endl; <br /><span> </span>cout<<"called:: taskFunc()arg1="<<arg1<<" arg2="<<(++(*arg2)) <<" arg3="<<++arg3<<" default="<<defaultArg<<endl; <br />} <br />int main() <br />{ <br /><br /> <span> </span><span style="color: #2b00fe;"><b>//Array of threads </b></span><br /><span> </span>std::thread threadPool[2]; <br /><br /><span> </span>int arg1=1, arg2=2000, arg3=3000; <br /><br /> <span> </span><b><span style="color: #2b00fe;">//Assign task to already existing thread Object. </span></b><br /><span> </span>cout<<"Assign task to Array of threads --threadPool[0] "<<endl; <br /><br /> <span> <span> </span></span>threadPool[0]= <span> </span>std::thread(taskFunc,arg1,&arg2,std::ref(arg3),true); <br /><span> </span>threadPool[0].join(); <br /><br /> <span> </span>cout<<"After:: taskFunc()arg1="<<arg1<<" arg2="<<arg2<<" arg3="<<arg3<<endl; <br /><br /> <span> </span><span style="color: #2b00fe;"><b>//Assign task to already existing thread Object. </b></span><br /><span> </span>cout<<endl<<"Assign task to Array of threads --threadPool[1] with lambda function"<<endl; <br /><span> </span>auto lmbdaFunc=[](int arg1, int* arg2, int& arg3){ <br /><span> </span><span> </span><span> </span>taskFunc(arg1,arg2,arg3); <br /><span> </span>}; <br /><br /> <span> </span>threadPool[1]=std::thread(lmbdaFunc,arg1,&arg2,std::ref(arg3)); <br /><span> </span>threadPool[1].join(); <br /><br /> <span> </span>cout<<"After:: taskFunc()arg1="<<arg1<<" arg2="<<arg2<<" arg3="<<arg3<<endl; <br /><span> </span>return 0; <br />}</span> </td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b>Compile:</b> g++ thread.cpp -o thread -lpthread<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<span style="font-family: courier;"><br /><b>Output:</b> ./thread <br /><br />Assign task to Array of threads --threadPool[0] <br />called:: taskFunc(int arg1, int* arg2, int& arg3,bool defaultArg=true) <br />called:: taskFunc()arg1=1 arg2=2001 arg3=3001 default=1 <br />After:: taskFunc()arg1=1 arg2=2001 arg3=3001 <br /><br />Assign task to Array of threads --threadPool[1] with lambda function <br />called:: taskFunc(int arg1, int* arg2, int& arg3,bool defaultArg=true) <br />called:: taskFunc()arg1=1 arg2=2002 arg3=3002 default=1 <br />After:: taskFunc()arg1=1 arg2=2002 arg3=3002</span>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
</td>
</tr>
</tbody></table><br /><br /><span style="color: #2b00fe;"><a href="https://www.techsujhav.com/2023/05/stdthreaddetach-advanced.html"><span style="font-size: x-large;"><b>PREV::</b></span><span style="font-size: medium;"> std::thread::detch() [Advanced]</span></a><br /><br /><div style="text-align: center;"><b><span style="font-size: x-large;"><a href="https://www.techsujhav.com/p/threads.html">Main Page</a></span></b></div><br /><div style="text-align: right;"><span style="font-size: large;"><a href="https://www.techsujhav.com/2023/06/how-to-call-static-function-member.html">How to call static function, member function by reference, </a></span></div></span><div style="text-align: right;"><span style="color: #2b00fe;"><span style="font-size: medium;"><a href="https://www.techsujhav.com/2023/06/how-to-call-static-function-member.html">value and pointer in thread. </a></span></span></div><div><div style="text-align: right;"><b style="color: #2b00fe;"><span style="font-size: x-large;"><a href="https://www.techsujhav.com/2023/06/how-to-call-static-function-member.html">::NEXT</a></span></b></div><p><b style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><br /></b></p><p><b style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br /></b></div><div style="font-size: 13.2px;"><b>So feel free to put Questions</b></div></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-7590627283929731052023-06-14T15:17:00.002+05:302023-07-11T18:44:42.659+05:30thread::native_handle and hardware_concurrency<p><span style="font-family: "Courier New";"><b><span style="font-size: x-large;">std::thread::native_handle</span></b></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: medium;">As we know that std::thread is written over[internally
uses] POSIX Pthread Library therefore if provides a POSIX thread handle to
support any feature that is as of now not part of std::thread but facility
available in POSIX Pthread Library such as thread scheduling.<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: "Courier New";"><span style="font-size: medium;">native_handle() return native thread handler.</span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size: x-large;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">std::thread::</span><span lang="EN-US"> </span></b></span><span lang="EN-US" style="font-family: "Courier New";"><span style="font-size: x-large;"><b>hardware_concurrency</b></span></span></p>
<p class="MsoNormal"><span style="font-family: "Courier New";"><span style="font-size: medium;">This shall return number of concurrent thread
supported by hardware implementation. It is just a hint.</span></span></p><p class="MsoNormal"><span style="font-family: "Courier New";"><span style="font-size: medium;"><br /></span></span></p><br /><br /><a href="https://www.techsujhav.com/2023/06/threadnativehandle-and.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;">thread::native_handle and hardware_concurrency</span></a><br /><div style="text-align: center;"><a href="https://www.techsujhav.com/p/threads.html"><span style="font-size: x-large;"><b>Main Page</b></span></a></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/frequently-asked-interview-questions-on.html"><span style="font-size: medium;">Frequently Asked Interview Questions on Threads</span><b><span style="font-size: x-large;">::NEXT</span></b></a></div><p class="MsoNormal"><b style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br /></b></div><div style="font-size: 13.2px;"><b>So feel free to put Questions</b></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-52743793698764501912023-06-14T11:15:00.005+05:302023-07-11T18:44:54.920+05:30Call overloaded operator from thread<p style="text-align: justify;"><span style="font-family: courier; font-size: medium;">Yes it is possible to call overloaded operator with thread. Here are some of the commonly used methods.</span></p><p style="text-align: justify;"><span style="font-family: courier; font-size: medium;">Let check with example where we shall try to compare two objects (</span><span style="background-color: white; font-family: courier; font-size: 13.2px; text-align: left;">sObj & </span><span style="font-family: courier; text-align: left;">newSuggest</span><span style="font-family: courier; font-size: large;">) of Suggest class.</span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none;"><tbody><tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span style="font-family: courier; text-align: justify;">#include<iostream></span></p><span style="font-family: courier;">#include <thread><br />#include<string><br />using namespace std;<br /><br />class Suggest<br />{<br /> string m_value;<br />public:<br /> Suggest()<br /> {<br /> cout<<"Constructor(default) :: Called"<<endl;<br /> m_value="Default Suggestion Given";<br /> }<br /> Suggest(string str)<br /> {<br /> cout<<"Constructor(string) :: Called"<<endl;<br /> m_value=str;<br /> }<br /> <b><span style="color: #2b00fe; font-size: medium;">//Overload == operator</span></b><br /> bool operator==(const Suggest& obj)const<br /> {<br /> if(this ->m_value == obj.m_value)<br /> {<br /> cout<<"SAME OBJECTS"<<endl;<br /> return true;<br /> }<br /> cout<<"DIFFERENT OBJECT"<<endl;<br /> return false;<br /> }<br /> void display()<br /> {<br /> cout<<"Suggestion:: "<<m_value<<endl;<br /> }<br />};<br />int main()<br />{<br /><br /> Suggest sObj("TechSujhav");<br /> sObj.display();<br /><br /> <b><span style="color: #2b00fe; font-size: medium;">//Call Overloaded operator== from thread</span></b><br /> cout<<"\nCall Overloaded operator== from thread"<<endl;<br /><br /> Suggest newSuggest;<br /> newSuggest.display();<br /><br /> std::thread objThrd2 ((&Suggest::operator==),sObj,newSuggest);<br /> objThrd2.join();<br /><br /> cout<<"\nCall Overloaded operator== using lambda from thread" <<endl;<br /><br /><b><span style="color: #2b00fe; font-size: medium;"> //Call Overloaded operator== using lambda from thread<br /> //passing argument in Capture list</span></b><br /> std::thread objThrd3 ([sObj,newSuggest](){<br /> if(sObj == newSuggest)<br /> cout<<"Perform Activity-1"<<endl;<br /> else<br /> cout<<"Perform Activity-2" <<endl;<br /> });<br /> <br /> objThrd3.join();<br /> return 0;<br />}</span></td></tr><tr><td style="border-bottom: 1pt solid windowtext; border-image: initial; border-left: 1pt solid windowtext; border-right: 1pt solid windowtext; border-top: none; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";">Command:</span></b><span lang="EN-US"> </span><span lang="EN-US" style="font-family: "Courier New";">g++ equalToOperator.cpp -o equalToOperator -lpthread<o:p></o:p></span></p></td></tr><tr><td style="border-bottom: 1pt solid windowtext; border-image: initial; border-left: 1pt solid windowtext; border-right: 1pt solid windowtext; border-top: none; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";">Output: </span></b><span lang="EN-US" style="font-family: "Courier New";">./equalToOperator<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span style="font-family: courier; text-align: justify;">Constructor(string) :: Called</span></p><span style="font-family: courier;">Suggestion:: TechSujhav<br /><br />Call Overloaded operator== from thread<br />Constructor(default) :: Called<br />Suggestion:: Default Suggestion Given<br /><br />DIFFERENT OBJECT<br /><br />Call Overloaded operator== using lambda from thread<br />DIFFERENT OBJECT<br />Perform Activity-2</span><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"> </span></p></td></tr></tbody></table><div><br /><br /><span style="font-family: times;"><a href="https://www.techsujhav.com/2023/06/call-functor-form-thread.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;"> How to call functor from thread</span></a><br /><div style="text-align: center;"><b><span style="font-size: x-large;"><a href="https://www.techsujhav.com/p/threads.html">Main Page</a></span></b></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/threadnativehandle-and.html"><span style="font-size: medium;">thread::native_handle and hardware_concurrency </span><b><span style="font-size: x-large;">::NEXT</span></b></a></div></span><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;"><br /></b></p><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br /></b></div><div style="font-size: 13.2px;"><b>So feel free to put Questions</b></div></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-17322003993415200362023-06-14T08:56:00.004+05:302023-07-11T18:45:08.557+05:30How to call functor form the thread<p><span style="font-family: courier; font-size: large;"><b>Yes,</b> It is possible to call functor from thread.</span></p><p><b><span style="font-family: courier; font-size: medium;">What is functor?</span></b></p><p><span style="font-family: courier;"><span style="font-size: medium;">Functor is not function, is it a case where </span><b><span style="color: red; font-size: x-large;">operator ()</span></b><span style="font-size: medium;"> is overloaded therefore object itself act as function or function pointer as per usage in code.</span></span></p><p><span style="font-family: courier;"><span style="font-size: medium;">Let's check the code where we are trying to modify value of member variable </span></span><span style="font-family: courier; font-size: medium;">m_value using functor.</span></p><p><span style="font-family: courier; font-size: medium;"><br /></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"><tbody><tr><td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">#include<iostream></span></p><span style="font-family: courier;">#include <thread><br />#include<string><br />using namespace std;<br /><br />class Suggest<br />{<br /><span> </span>string m_value;<br />public:<br /><span> </span>Suggest()<br /><span> </span>{<br /><span> </span><span> </span>cout<<"Constructor(default) :: Called"<<endl;<br /><span> </span><span> </span>m_value="Default Suggestion Given";<br /><span> </span>}<br /><span> </span>Suggest(string str)<br /><span> </span>{<br /><span> </span><span> </span>cout<<"Constructor(string) :: Called"<<endl;<br /><span> </span><span> </span>m_value=str;<br /><span> </span>}<br /><br /><span> </span><b><span style="color: #2b00fe; font-size: medium;">//functor i.e. overloaded () operator<br /><span> </span>//By which objects shall be treated as function & function pointer.</span></b><br /><span> </span>void operator()()<br /><span> </span>{<br /><span> </span><span> </span>cout<<"Functor :: Called - New Value added "<<endl;<br /><span> </span><span> </span>this -> m_value="Universal Suggestion Given";<br /><span> </span>}<br /><span> </span>void display()<br /><span> </span>{<br /><span> </span><span> </span>cout<<"Suggestion:: "<<m_value<<endl;<br /><span> </span>}<br />};<br /><br />int main()<br />{<br /><br /><span> </span>Suggest sObj;<br /><span> </span>sObj.display();<br /><br /><span> </span>cout<<"\nFUNCTOR - Call:: No object data changed"<<endl;<br /><b><span style="color: #2b00fe; font-size: medium;"><span> </span>//FUNCTOR - Call with thread()<br /><span> </span>//Important:: No object data changed.</span></b><br /><span> </span>std::thread objThrd(sObj);<br /><span> </span>objThrd.join();<br /><span> </span>sObj.display();<br /><br /><span> </span>cout<<"\nFUNCTOR - Call:: using lambda with std::thread"<<endl;<br /><b><span style="color: #2b00fe; font-size: medium;"><span> </span>//one way to change data-member of object<br /><span> </span>//FUNCTOR - Call using lambda with std::thread</span></b><br /><span> </span>std::thread objThrd1([&sObj](){sObj();});<br /><span> </span>objThrd1.join();<br /><span> </span>sObj.display();<br /><br /><span> </span>return 0;<br />}</span><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><br /></span></p></td></tr><tr><td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Compile:</span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">g++ functor.cpp -o functor -lpthread<b><o:p></o:p></b></span></p></td></tr><tr><td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Output:</span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">./functor<o:p></o:p></span></p><span style="font-family: courier;"><br />Constructor(default) :: Called<br />Suggestion:: Default Suggestion Given<br /><br /><br />FUNCTOR - Call:: No object data changed<br />Functor :: Called - New Value added<br />Suggestion:: Default Suggestion Given<br /><br />FUNCTOR - Call:: using lambda with std::thread<br />Functor :: Called - New Value added<br />Suggestion:: Universal Suggestion Given<br /></span><br /></td></tr></tbody></table><br /><br /><span style="color: #2b00fe; font-family: times;"><a href="https://www.techsujhav.com/2023/06/how-to-call-overloaded-member-function.html"><b><span style="font-size: x-large;">PREV::</span></b> <span style="font-size: medium;">How to call overloaded member function from thread</span></a><br /><div style="text-align: center;"><a href="https://www.techsujhav.com/p/threads.html"><span style="font-size: x-large;"><b>Main Page</b></span></a></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/call-overloaded-operator-from-thread.html"><span style="font-size: medium;">Call overloaded operator from thread</span><b><span style="font-size: x-large;">::NEXT</span></b></a></div></span><div><br /><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><span style="font-family: courier;"></span></p><p><span style="font-family: courier; font-size: medium;"></span></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br />So feel free to put Questions</b></div></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-37158727435827084812023-06-14T07:45:00.003+05:302023-07-11T18:45:18.861+05:30std::thread<div style="text-align: left;"><span style="font-family: courier; font-size: medium;"><span style="text-align: justify;">It is a class supported in and on-ward c++11, to create & manage thread. This class provides it’s user to various forms of constructor to create thread, destructor and some built-in function to manage threads.</span></span><ul><li><span style="font-family: courier; font-size: medium;">The task that we want to be performed by our thread, we must put that in a function. As we done in Here in our example “displayAcitviy”.</span></li></ul><ul><li><span style="font-family: courier; font-size: medium;">In a system, each thread is identified by a unique number known as <b>Thread ID</b>.</span></li></ul><ul><li><span style="font-family: courier; font-size: medium;">If there is no thread in program then it is called signal-threaded program. Because at lease our main() function is processed by scheduler and hence usually called as <b>MAIN THREAD</b>.</span></li></ul><ul><li><span style="font-family: courier; font-size: medium;">Thus our example have two thread (1) Created by t1 object (2) Main thread.</span></li></ul></div><span style="font-family: courier;"><div style="text-align: justify;"><span style="font-size: medium;"><br /></span></div><div style="text-align: justify;"><span style="font-size: medium;">std::thread uses pthread library that is usually called as <b>POSIX Library.</b></span></div><div style="text-align: justify;"><span style="font-size: medium;"><br /></span></div><div style="text-align: justify;"><span style="font-size: medium;"><br /></span></div><div style="text-align: justify;"><span style="font-size: medium;">Here is the first program to create a thread. It would be very useful if you <b>copy</b> following code and try to <b>compile</b> it on your system or can you any online compiler.</span></div><div style="text-align: justify;"><br /></div><div style="font-size: large; text-align: justify;"><div><br /></div><div><br /></div><div><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"><tbody><tr><td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-align: center;"><b><span lang="EN-US">Code<span style="font-family: Courier New; font-size: 10pt;"><o:p></o:p></span></span></b></p></td></tr><tr><td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">#include <iostream><br />#include<thread> <b><span style="color: #2b00fe;">//Thread Header</span></b><br />using namespace std;<br /><br /><b><span style="color: #2b00fe;">//displayAcitviy- is the actual function that is being<br />//called by the thread.</span></b><br />void displayAcitviy()<br />{<br /><span> </span>cout<<"www.techsujhav.com"<<endl;<br />}<br />int main()<br />{<br /><span> </span>cout<<"Main:: Going to create thread "<<endl;<br /><span> <br /><span> </span></span><span style="color: #2b00fe;"><b>//Create thread</b></span><br /><span> </span>std::thread t1(displayAcitviy);<br /><br /><span> </span><span style="color: #2b00fe;"><b>//join()- wait for thread t1 to complete its activity</b></span><br /><span> </span>t1.join();<br /><span> <br /></span><span> </span><b><span style="color: #2b00fe;">//exit Main</span></b><br /><span> </span>cout<<"Main:: Exit"<<endl;<br /><br /><span> </span>return 0;<br />}<br /><br /></td></tr><tr><td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; font-size: 10pt; mso-ansi-language: EN-US;"><br /></span></b></p><b>Compile:</b><br />$ g++ FirstThread.cpp -o FirstThread –lpthread<br /><br /><b><span style="color: #2b00fe;">//–lpthread is the threading library on linux, usually called POSIX library</span></b><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="color: #0070c0; font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><br /></span></p></td></tr><tr><td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; font-size: 10pt; mso-ansi-language: EN-US;"><br /></span></b></p><b>Output:</b><br /><br />Main:: Going to create thread<br />www.techsujhav.com<br />Main:: Exit<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><br /></span></p></td></tr></tbody></table></div></div></span><div><div style="text-align: justify;"><br /></div></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><span style="color: #2b00fe; font-family: times;"><a href="https://www.techsujhav.com/2023/05/chapter-3-types-of-threads.html"><span style="font-size: x-large;"><b>PREV::</b> </span><span style="font-size: medium;">Types of thread</span></a></span></div><div style="text-align: center;"><span style="color: #2b00fe; font-family: times; font-size: x-large;"><a href="https://www.techsujhav.com/p/threads.html">Main Page</a></span></div><div style="text-align: right;"><span style="font-family: times;"><a href="https://www.techsujhav.com/2023/05/stdthreadjoinable.html"><span style="font-size: medium;">std::thread::joinable()</span><b><span style="font-size: x-large;"> ::NEXT</span></b></a></span></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: start;"><b style="font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: start;"><span style="font-family: courier;"></span></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; text-align: start; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br />So feel free to put Questions</b></div></div></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-19215091966723283722023-06-13T20:09:00.007+05:302023-07-11T18:45:31.650+05:30Frequently Asked Interview Questions on Threads<p style="text-align: justify;"><span style="font-family: courier; font-size: medium;">Here are the list of frequently asked interview question and their answers. Hope that shall help you to update your knowledge.</span></p><p style="text-align: justify;"><b style="font-family: courier; text-align: left;"><span style="color: #2b00fe; font-size: large;">__________________________________________________________</span></b></p><p style="text-align: justify;"><span style="font-family: courier; text-align: left;"><span style="font-size: medium;"><b>Ques: <span style="color: red;"><i><a href="https://www.techsujhav.com/2023/05/chapter-2-process-and-thread-in.html" target="_blank">What is thread?</a> </i></span></b></span></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/05/chapter-1-concurrency-and-parallelism.html" target="_blank"><i>What does thread/process follow, Parallelism or Concurrency ?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/05/chapter-2-process-and-thread-in.html" target="_blank"><i>Why does thread is called light-weighted process?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/05/chapter-3-types-of-threads.html" target="_blank"><i>What are different types of threads?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/05/chapter-3-types-of-threads.html" target="_blank"><i>Is it necessary that User-Level thread shall be associated with Kernel-Level Thread?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/05/chapter-2-process-and-thread-in.html" target="_blank"><i>What are the system resources shared between process and thread?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/05/stdthreadjoin.html" target="_blank"><i>Why do we join a thread?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-why-do-we-need-to.html" target="_blank"><i>What will happen if we don't call join() or detach() on thread object?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques:<i> <a href="https://www.techsujhav.com/2023/05/stdthreaddetach-advanced.html" target="_blank">Can we join the detached thread?</a></i></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques:<i> <a href="https://www.techsujhav.com/2023/05/stdthreaddetach-advanced.html" target="_blank">What will happen if main thread exit before detached thread complete its assigned task?</a></i></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-what-will-happen-if.html" target="_blank"><i>What will happen if call join() again on same thread object?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-can-we-reuse-that.html" target="_blank"><i>Can we use the same thread object for different task after join()?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/06/how-to-call-static-function-member.html" target="_blank"><i>How to call a static member function from a thread?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/06/how-to-call-overloaded-member-function.html" target="_blank"><i>How to call Overloaded member function from a thread?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/06/how-to-call-overridden-virtual-function.html" target="_blank"><i>How to call Overridden Virtual function from a thread?</i></a></b></span></p><p style="text-align: left;"><span style="font-family: courier; font-size: medium;"><b>Ques: <a href="https://www.techsujhav.com/2023/06/call-overloaded-operator-from-thread.html" target="_blank">Is is possible to call overloaded operator to call from a thread?</a></b></span></p><p style="text-align: left;"><span style="font-family: courier;"><br /></span></p><p style="text-align: left;"><br /></p><span style="font-family: times;"><a href="https://www.techsujhav.com/2023/06/threadnativehandle-and.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;">thread::native_handle and hardware_concurrency</span></a><br /><div style="text-align: center;"><a href="https://www.techsujhav.com/p/threads.html"><span style="font-size: x-large;"><b>Main Page</b></span></a></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/how-to-debug-threads-with-gdb-debugger.html"><span style="font-size: medium;">How to debug threads with GDB debugger</span><b><span style="font-size: x-large;">::NEXT</span></b></a></div></span><p style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><p><span style="font-family: courier;"></span></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br />So feel free to put Questions</b></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-44124542413548917492023-06-12T17:11:00.005+05:302023-07-11T18:45:52.555+05:30How to call static function, member function by reference, value and pointer in thread.<p><span style="font-family: courier; font-size: medium;">It is very simple to call a member function or static member function from thread following is the example the shall help us.</span></p><p><span style="font-family: courier; font-size: medium;"><span style="background-color: white;">For best understanding please </span><b style="background-color: white;">COPY</b><span style="background-color: white;">, </span><b style="background-color: white;">PASTE</b><span style="background-color: white;"> and </span><b style="background-color: white;">RUN</b><span style="background-color: white;"> in any online compiler.</span></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><span style="font-family: courier;">include <iostream> <br />#include <thread> <br />#include <string> <br />using namespace std; <br /><br />class Suggest <br />{ <br /><span> </span>string m_name; <br />public: <br /><span> </span>Suggest() <br /><span> </span>{ <br /><span> </span><span> </span>m_name="Tech"; <br /><span> </span>} <br /><span> </span>void updateName(string str) <br /><span> </span>{ <br /><span> </span><span> </span>m_name=str; <br /><span> </span>} <br /><span> </span>void displayName() <br /><span> </span>{ <br /><span> </span><span> </span>cout<<"Name "<<m_name<<endl; <br /><span> </span>} <br /><span> </span><span style="color: red;"><b><span style="font-size: large;">static</span> </b></span>void display(string str) <br /><span> </span>{ <br /><span> </span><span> </span>cout<<"Static Function Call :: "<<str<<endl; <br /><span> </span>} <br />}; <br />int main() <br />{ <br /><span> </span><b><span style="color: #2b00fe; font-size: large;">//Call static function both ways are correct</span></b><br /><span> </span>std::thread objThd(Suggest::display,"without &"); <br /><span> </span>objThd.join(); <br /><br /> <span> </span>std::thread objThd1(&Suggest::display,"with &"); <br /><span> </span>objThd1.join(); <br /><br /> <span> </span>cout<<endl<<"Call Member Function "<<endl; <br /><span style="color: #2b00fe; font-size: large;"><b><span> </span>//call thread by object for member function, <br /><span> </span>//object is passed by value </b></span><br /><span> </span>Suggest <span style="color: red;"><b><span style="font-size: large;">sObj</span></b>; </span><br /><span> </span>cout<<"Object PASSED-BY-VALUE "<<endl; <br /><span> </span>sObj.displayName(); <br /><br /> <span> </span>std::thread objThrd(&Suggest::updateName,<b><span style="color: red; font-size: large;">sObj</span></b>,"Value - Suggestion"); <br /><span> </span>objThrd.join(); <br /><span> </span>sObj.displayName(); <br /><br /> <span> </span><span style="color: #2b00fe; font-size: large;"><b>//object is passed by reference </b></span><br /><span> </span>cout<<endl<<"Object PASSED-BY-REFERENCE "<<endl; <br /><span> </span>Suggest <b><span style="color: red; font-size: large;">sObjNew</span></b>; <br /><span> </span>sObjNew.displayName(); <br /><br /> <span> </span>std::thread objThrd1(&Suggest::updateName,<span style="font-size: large;"><span style="color: red;"><b>&</b></span><span style="color: red;"><b>sObjNew</b></span></span>,"Reference - Suggestion"); <br /><span> </span>objThrd1.join(); <br /><span> </span>sObjNew.displayName(); <br /><br /><span> </span><span style="color: #2b00fe; font-size: large;"><b>//object is passed by pointer </b></span><br /><span> </span>cout<<endl<<"Object PASSED-BY-POINTER "<<endl; <br /><span> </span>Suggest* <b><span style="color: red; font-size: large;">ptrObj</span></b>=new Suggest; <br /><span> </span>ptrObj->displayName(); <br /><br /> <span> </span>std::thread objThrd2(&Suggest::updateName,<b><span style="color: red; font-size: large;">ptrObj</span></b>,"Pointer - Suggestion"); <br /><span> </span>objThrd2.join(); <br /><span> </span>ptrObj->displayName(); <br /><span> <br /></span><span> </span>return 0; <br />}</span><br /> </td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b>Compile:</b> g++ classFunctions.cpp -o
classFunctions -lpthread</span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Output:</span><span lang="EN-US"> </span><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$ ./classFunctions<o:p></o:p></span></p>
<span style="font-family: courier;"><br />Static Function Call :: without & <br />Static Function Call :: with & <br /><br />Call Member Function <br /><br /><b>Object PASSED-BY-VALUE </b><br /><br />Name Tech <br />Name Tech <br /><br /><b>Object PASSED-BY-REFERENCE </b><br /><br />Name Tech <br />Name Reference - Suggestion <br /><br /><b>Object PASSED-BY-POINTER</b><br /><br />Name Tech <br />Name Pointer - Suggestion <br /></span><br /></td></tr></tbody></table><br /><br /><span style="font-family: times;"><a href="https://www.techsujhav.com/2023/06/how-to-call-function-with-reference.html"><span style="font-size: x-large;"><b>PREV:: </b></span><span style="font-size: medium;">How to Call function with Reference Variable, </span></a></span><div><span style="font-family: times; font-size: large;"><a href="https://www.techsujhav.com/2023/06/how-to-call-function-with-reference.html">Default Argument and Pointer Variable from thread.</a></span><br /><div style="text-align: center;"><span style="font-size: xx-large;"><a href="https://www.techsujhav.com/p/threads.html">Main Page</a></span></div><span style="color: #2b00fe;"><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/how-to-call-overridden-virtual-function.html"><span style="font-size: medium;">How to call overridden virtual function from thread</span><b><span style="font-size: x-large;">::NEXT</span></b></a></div></span><p><b style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><br /></b></p><p><b style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><div class="post-body entry-content" id="post-body-1616357328885825626" itemprop="articleBody" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; line-height: 1.4; position: relative; width: 668px;"><p class="MsoNormal" style="font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="font-size: 13.2px;"><b><br />So feel free to put Questions</b></div></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-16163573288858256262023-06-06T20:10:00.006+05:302023-07-11T18:46:02.533+05:30How to call overridden virtual function from thread<p><span style="font-family: "Courier New"; font-size: medium;">To call correct overridden function we are supposed to
pass correct pointer or reference object.</span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: medium;">Note:- use</span><b><span style="color: red;"> <span style="font-size: x-large;">&</span> </span></b><span style="font-size: medium;">to pass reference variable.<o:p></o:p></span></span></p><p><span style="font-family: "Courier New"; font-size: medium;">For best understanding please <b>COPY</b>, <b>PASTE</b> and <b>RUN</b> in any online compiler.</span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-size: 9pt;"><span style="font-family: courier;"><br /></span></span></p><span style="font-family: courier;">#include<iostream> <br />#include <thread> <br />#include<string> <br />using namespace std; <br />class Base <br />{ <br /><span> </span>public: <br /><span> </span><span> </span>virtual void displayName(string name) <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>cout<<"Base :: "<<name<<endl; <br /><span> </span><span> </span>}<br />}; <br />class Derived1: public Base <br />{<br /><span> </span>public: <br /><span> </span><span> </span>void displayName(string name) <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>cout<<"Derived-1 :: "<<name<<endl; <br /><span> </span><span> </span>}<br />}; <br />class Derived2: public Base <br />{ <br /><span> </span>public: <br /><span> <span> </span></span>void displayName(string name) <br /><span> <span> </span></span>{ <br /><span> </span><span> </span><span> </span>cout<<"Derived-2 :: "<<name<<endl; <br /><span> </span><span> </span>}<br />};<br />int main() <br />{ <br /><span> </span><b><span style="color: #2b00fe; font-size: medium;">//call overridden function using pointer</span></b><br /> <span> </span>Base* bPtr=nullptr; //NULL <br /><span> </span>bPtr=new Derived1; <br /><span> <br /></span><span> </span>std::thread objThrd(&Base::displayName,bPtr,"techSujhav.com"); <br /><span> </span>objThrd.join(); <br /><span> </span>delete bPtr; <br /><br /><span> </span>bPtr=new Derived2; <br /><br /> <span> </span>std::thread objThrd1(&Base::displayName,bPtr,"techSujhav.com"); <br /><span> </span>objThrd1.join(); <br /><span> </span>delete bPtr; <br /><br /><span> </span>bPtr=new Base; <br /><br /> <span> </span>std::thread objThrd2(&Base::displayName,bPtr,"techSujhav.com"); <br /><span> </span>objThrd2.join(); <br /><span> </span>delete bPtr; <br /><br /><span> </span></span><span style="color: #2b00fe;"><span style="font-family: courier; font-size: medium;"><b>//call overridden function </b></span></span><span style="font-family: courier;"><span style="color: #2b00fe; font-size: medium;"><b>using refernece object</b></span><br /><span> </span>Derived1 d1_Obj; <br /><span> </span>Base& refBaseObj=d1_Obj; <br /><span> </span>std::thread objThrd3(&Base::displayName,<b><span style="color: red; font-size: x-large;">&</span></b>refBaseObj,"refBaseObj :: techSujhav.com"); <br /><span> </span>objThrd3.join(); <br /><br /> <span> </span>return 0; <br />}</span><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;"><br /></span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$ g++ overRide.cpp -o overRide –lpthread<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$ ./overRide<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Derived-1 :: techSujhav.com<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Derived-2 :: techSujhav.com<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Base :: techSujhav.com<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Derived-1 :: refBaseObj :: techSujhav.com<o:p></o:p></span></p>
</td>
</tr>
</tbody></table><br /><br /><span style="color: #2b00fe; font-family: times;"><a href="https://www.techsujhav.com/2023/06/how-to-call-static-function-member.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;">How to call static function, member function by reference, </span></a></span><div><span style="color: #2b00fe; font-family: times;"><a href="https://www.techsujhav.com/2023/06/how-to-call-static-function-member.html" style="font-size: large;">value and pointer in thread.</a><br /><div style="text-align: center;"><a href="https://www.techsujhav.com/p/threads.html"><span style="font-size: x-large;"><b>Main Page</b></span></a></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/how-to-call-overloaded-member-function.html"><span style="font-size: medium;">How to call overloaded member function from thread</span><b><span style="font-size: x-large;">::NEXT</span></b></a></div></span><p><br /></p><p class="MsoNormal" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b style="font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><p class="MsoNormal" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b><br />So feel free to put Questions</b></div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-64697952759981846562023-06-02T18:56:00.001+05:302023-07-11T18:46:12.926+05:30How to call overloaded member function from thread<p><span style="font-family: "Courier New";">YES, it is possible to call overloaded function and
overloaded member function if we successfully resolve ambiguity of overloaded
functions.</span></p>
<p class="MsoNormal"><span style="font-family: "Courier New";">Let’s first check what’s an error it generate and <b><span style="color: red; font-size: large;">why
does it generate that error.</span></b></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><span style="font-family: courier;">#include<iostream> <br />#include <thread> <br />using namespace std; <br />class Suggest <br />{ <br /><span> </span>public: <br /><span> </span>void memberFunction(int arg1,int arg2) <br /><span> </span>{ <br /><span> </span><span> </span>cout<<"memberFunction :: "<<arg1 <<" "<<arg2<<endl; <br /><span> </span>} <br /><span> </span>void memberFunction(int arg1) <br /><span> </span>{ <br /><span> <span> </span></span>cout<<"memberFunction :: "<<arg1<<endl; <br /><span> </span>}<br />};<br />int main() <br />{ <br /><span> </span>Suggest sObj; <br /><span> </span><b><span style="color: red;">std::thread objThrd(&Suggest::memberFunction,sObj,10); </span></b><br /><span> </span>objThrd.join(); <br /><span> </span>return 0; <br />}</span></td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Compile: </span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">g++
overloadFailure.cpp -o overloadFailure –lpthread<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">overloadFailure.cpp: In function âint main()â:<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">overloadFailure.cpp:20:61: error: no matching function for call to
âstd::thread::thread(<<b><span style="color: red;">unresolved overloaded function type</span></b>>,
Suggest&, nt)â<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> std::thread
objThrd(&Suggest::memberFunction,sObj,10<span style="color: red;"><b>)</b></span>;</span><span style="font-family: "Courier New";"> <span style="color: red;"><b>^</b></span></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="color: red; font-family: Courier New;"><b>Compile is not able to resolve name mangling conflict.</b></span></p>
</td>
</tr>
</tbody></table><p class="MsoNormal"><span style="color: red; font-family: "Courier New"; font-size: x-large;"><b>Solution:</b></span><span style="font-family: "Courier New";"> </span></p><p class="MsoNormal"><span style="font-family: courier;">They are multiple ways to resolve above issue</span></p><div style="text-align: left;"><ul style="text-align: left;"><li><span style="font-family: courier;">Explicitly type-cast to correct member function using any cast method available.</span></li><li><span style="font-family: courier;">use a workaround to call our member function with the help of lambda function.</span></li></ul></div><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><span style="font-family: courier;">#include<iostream> <br />#include <thread> <br />#include<string> <br />using namespace std; <br />class Suggest <br />{ <br /><span> </span>public:<br /> <span> </span>void memberFunction(string arg1,int arg2) <br /><span> </span>{ <br /><span> </span><span> </span>cout<<"2-Args memberFunction :: "<<arg1 <<", "<<arg2<<endl; <br /><span> </span>}<br /> <span> </span>void memberFunction(string arg1) <br /><span> </span>{<br /> <span> </span><span> </span>cout<<"1-Arg memberFunction :: "<<arg1<<endl; <br /><span> </span>} <br />}; <br />int main() <br />{ <br /><span> </span>Suggest sObj; <br /><span> </span>//<b><span style="color: #2b00fe; font-size: large;">Solution -1</span></b><span style="color: #2b00fe;"> :: by using static_cast<> <br /><span> </span>//TYPECAST to the function that we want to call <br /><span> </span>//we are suppose to call one argument function </span><br /><span> </span>std::thread objThrd1 (<b><span style="color: red;">static_cast<void (Suggest::*)(string, int)></span></b>(&Suggest::memberFunction),sObj,"using static_cast<>" ,4); <br /><span> </span>objThrd1.join(); <br /><br /> <span> </span>std::thread objThrd2 (<b><span style="color: red;">static_cast<void (Suggest::*)(string)></span></b>(&Suggest::memberFunction),sObj,"using static_cast<>"); <br /><span> </span>objThrd2.join(); <br /><br /><span style="color: #2b00fe;"><span> </span>//<b><span style="font-size: large;">Solution-2</span></b>:: c-style typecast with typdef <br /><span> </span>//we are suppose to call no argument function </span><br /><span> </span><b><span style="color: red;">typedef void (Suggest::*MPF2ARGS)(string,int); </span></b><br /><span> </span>std::thread objThrd3 (<b><span style="color: red;">(MPF2ARGS) </span></b>&Suggest::memberFunction),sObj,"using typedef",4); <br /><span> </span>objThrd3.join(); <br /><span> <br /></span><span> </span><b><span style="color: red;">typedef void (Suggest::*MPF1ARG)(string); </span></b><br /><span> </span>std::thread objThrd4 ((<b><span style="color: red;">MPF1ARG</span></b>)(&Suggest::memberFunction),sObj,"using typdef"); <br /><span> </span>objThrd4.join(); <br /><br /><span style="color: #2b00fe;"><span> </span>//<span style="font-size: large;"><b>Solution-3</b></span>:: c-style caste with function pointer variable <br /><span> </span>//we are suppose to call no argument function <br /><span> </span>//ptr is a pointer variable of type noArgumentFunc. </span><br /><span> </span><b><span style="color: red;">MPF2ARGS ptr; </span></b><br /><span> </span><b><span style="color: red;">ptr</span></b>=&Suggest::memberFunction; <br /><span> </span>std::thread objThrd5 (<b><span style="color: red;">ptr</span></b>,sObj,"using typedef function pointer variable",4); <br /><span> </span>objThrd5.join(); <br /><br /> <span> </span><span style="color: #2b00fe;">//<b><span style="font-size: large;">Solution-4</span></b>:: Using lambda function </span><br /><span> </span>std::thread objThrd6(<b><span style="color: red;">[](Suggest s,string value, int i){ s.memberFunction (value,i);},</span></b>sObj,"lamba function",4); <br /><span> </span>objThrd6.join(); <br /><br /><span> </span>std::thread objThrd7(<b><span style="color: red;">[](string value, Suggest s) { s.memberFunction(value);}</span></b>,"lamba function",sObj); <br /><span> </span>objThrd7.join(); <br /><br /> <span> </span><span style="color: #2b00fe;">//<span style="font-size: large;"><b>Solution-5</b></span>:: Using auto keyword </span><br /><span> </span>auto <b><span style="color: red;">fName</span></b>=[](Suggest s,string value, int i){s.memberFunction(value,i);}; <br /><span> </span>std::thread objThrd8(<span style="color: red;">fName</span>,sObj,"lamba function",4); <br /><span> </span>objThrd8.join(); <br /><br /> <span> </span><span style="color: #2b00fe;">//<b><span style="font-size: large;">Solution-6</span></b>:: using using keyword</span><br /> <span> </span>using <b><span style="color: red;">uNameFunc</span></b>=void (Suggest::*)(string, int); <br /><span> </span><span style="color: red;">uNameFunc</span> uVariable=&Suggest::memberFunction; <br /><span> </span>std::thread objThrd9(<b><span style="color: red;">uVariable</span></b>,sObj,"using using keyword", 4); <br /><span> </span>objThrd9.join(); <br /><br /><span> </span>return 0; <br />}</span></td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Compile: </span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">g++
overloadMember.cpp -o overloadMember -lpthread<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Output:</span></b></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">./overloadMember<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">2-Args memberFunction :: using static_cast<>, 4<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">1-Arg memberFunction :: using static_cast<><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">2-Args memberFunction :: using typedef, 4<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">1-Arg memberFunction :: using typdef<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">2-Args memberFunction :: using typedef function pointer variable, 4<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">2-Args memberFunction :: lamba function, 4<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">1-Arg memberFunction :: lamba function<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">2-Args memberFunction :: lamba function, 4<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">2-Args memberFunction :: using using keyword, 4<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">
^<o:p></o:p></span></p>
</td>
</tr>
</tbody></table><br /><br /><span style="font-family: times;"><a href="https://www.techsujhav.com/2023/06/how-to-call-overridden-virtual-function.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;">How to call overridden VIRTUAL function from thread</span></a><br /><div style="text-align: center;"><a href="https://www.techsujhav.com/p/threads.html"><span style="font-size: x-large;">Main Page</span></a></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/call-functor-form-thread.html"><span style="font-size: medium;">Call functor form the thread</span><b><span style="font-size: x-large;">::NEXT</span></b></a></div></span><p class="MsoNormal"><b style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><p class="MsoNormal" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b><br />So feel free to put Questions.</b></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-23727250397101091902023-06-01T20:22:00.004+05:302023-07-11T18:46:29.029+05:30How to debug threads with GDB debugger<p style="text-align: left;"><span style="font-family: courier;">Here we shall discuss how to debug a thread with GDB-debugger. Here are the list of items that are discussed with example.</span></p><p style="text-align: left;"></p><h4 style="text-align: left;"><ul style="text-align: left;"><li><span style="font-family: courier; font-size: medium;"><span style="font-weight: normal;">How to </span>connect GDB<span style="font-weight: normal;"> with a</span> multi-threaded binary <span style="font-weight: normal;">or</span> a core file <span style="font-weight: normal;">generated after crash?</span></span></li></ul><ul style="text-align: left;"><li><span style="font-family: courier; font-size: medium;"><span style="font-weight: normal;">How to</span> connect GDB <span style="font-weight: normal;">with a</span> running <span style="font-weight: normal;">multi-threaded</span> process?</span></li></ul><ul style="text-align: left;"><li><span style="font-family: courier;"><span style="font-size: large; font-weight: normal;">Check</span> <span style="color: red; font-size: large;">threads status at the time of crash</span><span style="font-size: medium;">, </span><span style="font-size: large; font-weight: normal;">breakpoint and watchpoint.</span>***IMPORTANT***<span style="font-weight: normal;"> <span style="font-size: medium;"> </span></span></span></li></ul><ul style="text-align: left;"><li><span style="color: red; font-family: courier; font-size: medium;">Check activity of a given thread. </span><span style="font-family: courier;">***IMPORTANT*** </span></li></ul><ul style="text-align: left;"><li><span style="font-family: courier; font-size: medium;"><span style="font-weight: normal;">How to</span> find <span style="font-weight: normal;">a thread</span> <span style="font-weight: normal;">with</span> thread-id.</span></li></ul><ul style="text-align: left;"><li><span style="font-family: courier; font-size: medium;"><span style="font-weight: normal;">How to</span> find <span style="font-weight: normal;">a thread with </span>thread-id <span style="font-weight: normal;">returned by</span> get_id().</span></li></ul><div><span style="font-family: courier;">Suggestion:<span style="font-weight: normal;"> For better learning please do suggested step by yourself.</span></span></div><div><span style="font-family: courier;">Copy</span><span style="font-family: courier; font-weight: normal;">, </span><span style="font-family: courier;">Paste</span><span style="font-family: courier; font-weight: normal;"> and </span><span style="font-family: courier;">Run</span><span style="font-family: courier; font-weight: normal;"> example code.</span></div><div><span style="font-family: courier; font-weight: normal;"><br /></span></div><div><span style="font-family: courier; font-weight: normal;">NOTE: - </span><span style="color: red; font-family: courier; font-size: medium;">GDB </span><span style="font-family: courier;"><span style="color: red;"><span style="font-size: medium;">COMMANDS in red</span>, </span><span style="color: #2b00fe; font-size: medium;">[Description in blue]</span></span></div><div></div></h4><p></p><span style="font-family: courier;"><div style="text-align: left;"><b><span style="color: red; font-size: medium;">How to connect GDB with a multi-threaded binary or a core file generated after crash?</span></b></div><div style="text-align: left;">we are suppose to generate binary with one of the -g, -g2, -g3 option. Let check how our example shall be compiled</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><b>Compile Binary</b></div><div style="text-align: left;">$g++ gdbThread.cpp -o gdbThread <span style="color: red; font-size: x-large;"><b>-g</b></span> -lpthread</div><div style="font-size: x-large; text-align: left;"><b><span style="color: red;"><br /></span></b></div><div style="text-align: left;"><b>Attach binary with gdb</b></div><div style="text-align: left;"><span style="font-size: large;">$gdb ./<absolute-binary-name></span></div><div style="text-align: left;">$gdb ./gdbThread</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><b>Attach core file with gdb</b></div><div style="text-align: left;"><span style="font-size: large;">$gdb -c <absolute-core-file-name> <absolute-binary-name></span></div><div style="text-align: left;">$gdb -c crash1932.core gdbThread</div></span><span style="font-family: courier;"><div style="font-size: x-large; text-align: left;"><b><br /></b></div><div style="text-align: left;"><span style="color: red; font-family: courier; font-size: medium;"><b>How to connect GDB with a running multi-threaded process?</b></span></div><div style="text-align: left;"><ol style="text-align: left;"><li>Get process id of a running process with following Linux command<span style="color: red;"> </span></li></ol><div><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span>$ ps –ef |grep -i <running_process_executable_name></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p><span style="font-family: Courier New; font-size: x-small;"><br /></span><span style="font-family: "Courier New"; font-size: small;">$ ps -ef |grep -i gdbThread</span><div><span style="font-family: "Courier New"; font-size: small;">TechSujhav</span><span style="font-family: "Courier New"; font-size: small;"> </span><span style="font-family: "Courier New"; font-size: small;"><b>10640</b> 10237 99 06:20 pts/0</span><span style="font-family: "Courier New"; font-size: small;"> </span><span style="font-family: "Courier New"; font-size: small;">00:00:31 ./gdbThread</span><div style="font-family: "Times New Roman";"><span style="font-family: "Courier New"; font-size: small;">TechSujhav</span><span style="font-family: "Courier New"; font-size: small;"> </span><span style="font-family: "Courier New"; font-size: small;">10645 10403</span><span style="font-family: "Courier New"; font-size: small;"> </span><span style="font-family: "Courier New"; font-size: small;">0 06:21 pts/1</span><span style="font-family: "Courier New"; font-size: small;"> </span><span style="font-family: "Courier New"; font-size: small;">00:00:00 grep --color=auto -i gdbThread</span></div></div><div><span style="font-family: "Courier New"; font-size: small;"><br /></span></div>
</td>
</tr>
</tbody></table></div></div></span><br /><div><div><div><span style="font-family: "Courier New";"><br /></span></div><div><span style="font-family: "Courier New";"> 2.<span style="font-size: x-small;"> </span>Attach process with gdb</span></div></div></div><div><span style="font-family: "Courier New";"> $</span><span style="color: red; font-family: "Courier New"; font-size: x-large;"><b>gdb -p
10640</b></span></div><div><span style="font-family: "Courier New";"><br /></span></div><div><span style="font-family: "Courier New";"><b>Code used for explanation</b></span></div><div><span style="font-family: "Courier New";"><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><span style="font-family: courier;"><span style="font-size: x-small;">#include <iostream> </span><br /><span style="font-size: x-small;">#include <thread> </span><br /><span style="font-size: x-small;">#include <string> </span><br /><span style="font-size: x-small;">using namespace std; </span><br /><span style="font-size: x-small;">class Suggest </span><br /><span style="font-size: x-small;">{ </span><br /><span style="font-size: x-small;"> unsigned int counter; </span><br /><span style="font-size: x-small;">public: </span><br /><span style="font-size: x-small;"> Suggest():counter(1){} </span><br /><span style="font-size: x-small;"> void suggestActivity() </span><br /><span style="font-size: x-small;"> { </span><br /><span style="font-size: x-small;"> while(++counter) </span><br /><span style="font-size: x-small;"> { </span><br /><span style="font-size: x-small;"> if(counter%500000000 ==0) </span><br /><span style="font-size: x-small;"> cout<<"Suggest::suggestActivity = "<<counter<<endl;; </span><br /><span style="font-size: x-small;"> if(counter == 4294967295) </span><br /><span style="font-size: x-small;"> counter=0; </span><br /><span style="font-size: x-small;"> }</span><br /><span style="font-size: x-small;"> } </span><br /><span style="font-size: x-small;">}; </span><br /><span style="font-size: x-small;">void increment() </span><br /><span style="font-size: x-small;">{ </span><br /><span style="font-size: x-small;"> unsigned int counter=0; </span><br /><span style="font-size: x-small;"> while(++counter) </span><br /><span style="font-size: x-small;"> { </span><br /><span style="font-size: x-small;"> if(counter%300000000 ==0) </span><br /><span style="font-size: x-small;"> cout<<"increment = "<<counter<<endl; </span><br /><span style="font-size: x-small;"> if(counter == 2147483647) </span><br /><span style="font-size: x-small;"> counter=0; </span><br /><span style="font-size: x-small;"> } </span><br /><span style="font-size: x-small;">} </span><br /><span style="font-size: x-small;">void decrement() </span><br /><span style="font-size: x-small;">{ </span><br /><span style="font-size: x-small;"> unsigned int counter=4294967295; </span><br /><span style="font-size: x-small;"> while(--counter) </span><br /><span style="font-size: x-small;"> if(counter%100000000 ==0) </span><br /><span style="font-size: x-small;"> cout<<"decrement = "<<counter<<endl; </span><br /><span style="font-size: x-small;">} </span><br /><span style="font-size: x-small;">int main() </span><br /><span style="font-size: x-small;">{ </span><br /><span style="font-size: x-small;"> </span><b><span style="color: #2b00fe;">//thread id of main thread</span></b><br /><span style="font-size: x-small;"> cout<<"main() Thread Id=0x"<<std::hex <<std::this_thread::get_id()<<std::dec<<" ::"<<std::this_thread::get_id()<<endl; </span><br /><span style="font-size: x-small;"> </span><b><span style="color: #2b00fe;">//First thread is created</span></b><br /><span style="font-size: x-small;"> std::thread thrdObj(increment); </span><br /><span style="font-size: x-small;"> cout<<"increament() Thread Id=0x"<<std::hex <<thrdObj.get_id()<<std::dec<<" ::"<<thrdObj.get_id()<<endl; </span><br /><span style="font-size: x-small;"> thrdObj.detach(); </span><br /><span style="font-size: x-small;"> </span><b><span style="color: #2b00fe;">//Second Thread is created</span></b><br /><span style="font-size: x-small;"> std::thread thrdObj1(decrement); </span><br /><span style="font-size: x-small;"> cout<<"decrement() Thread Id=0x"<<std::hex <<thrdObj1.get_id()<<std::dec<<" ::"<<thrdObj1.get_id()<<endl; </span><br /><span style="font-size: x-small;"> thrdObj1.detach(); </span><br /><span style="font-size: small;"> </span></span><b style="font-family: courier;"><span style="color: #2b00fe;">//Third Thread is created</span></b><span style="font-family: courier; font-size: x-small;"><br /> Suggest sObj; <br /> std::thread thrdObj2(&Suggest::suggestActivity,sObj); <br /> cout<<"Suggest::suggestActivity() Thread Id=0x"<<std::hex <<thrdObj2.get_id()<<std::dec<<" ::"<<thrdObj2.get_id()<<endl<<endl; <br /><span> </span>thrdObj2.join(); <br /><span> </span>return 0; <br />}</span>
</td>
</tr>
</tbody></table></span></div><div><span style="font-family: "Courier New";"><br /></span></div><div><span style="font-family: "Courier New";"><span style="color: red; font-size: large;"><b>Put breakpoint for a given thread logically.</b></span></span></div><div><span style="font-family: "Courier New";"><span style="color: red; font-size: large;"><b><br /></b></span></span></div><div><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b><span style="color: red;">gdb ./gdbThread</span></b><o:p></o:p></span></p>
<br /><span style="font-family: times;">GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git<br />Copyright (C) 2018 Free Software Foundation, Inc.<br />License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html><br />This is free software: you are free to change and redistribute it.<br />There is NO WARRANTY, to the extent permitted by law. Type "show copying"<br />and "show warranty" for details.<br />This GDB was configured as "x86_64-linux-gnu".<br />Type "show configuration" for configuration details.<br />For bug reporting instructions, please see:<br /><http://www.gnu.org/software/gdb/bugs/>.<br />Find the GDB manual and other documentation resources online at:<br /><http://www.gnu.org/software/gdb/documentation/>.<br />For help, type "help".<br />Type "apropos word" to search for commands related to "word"...<br />Reading symbols from ./gdbThread...done. </span><br /><br /><span style="font-family: courier;">(gdb) <b><span style="color: red;"><span style="font-size: large;">b gdbThread.cpp:16 </span></span><span style="color: #2b00fe; font-size: medium;">[Breakpoint added on line-16]</span></b></span><br /><br />Breakpoint 1 at 0x18d9: file gdbThread.cpp, line 16. <br /><br /><span style="font-family: courier;">(gdb) <span style="font-size: large;"><b><span style="color: red;">r </span></b> </span> <b><span style="color: #2b00fe; font-size: medium;">[Press r to run binary]</span></b></span><br /><br />Starting program: /home/TechSujhav/thread/gdbThread<br />[Thread debugging using libthread_db enabled]<br />Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".<br />main() Thread Id=0x7ffff7fe3740 ::140737354020672<br />[New Thread 0x7ffff6e85700 (LWP 11079)]<br />increament() Thread Id=0x7ffff6e85700 ::140737335809792 <br /><br />[New Thread 0x7ffff6684700 (LWP 11080)]<br />decrement() Thread Id=0x7ffff6684700 ::140737327417088 <br /><br />[New Thread 0x7ffff5e83700 (LWP 11081)]<br />Suggest::suggestActivity() Thread Id=0x7ffff5e83700 ::140737319024384 <br /><br />decrement = 4200000000 <br />decrement = 4100000000 <br />decrement = 4000000000 <br />increment = 300000000 <br />decrement = 3900000000 <br />decrement = 3800000000 <br />decrement = 3700000000 <br /><br />[Switching to Thread 0x7ffff5e83700 (LWP 11081)]<b><span style="color: #2b00fe;"><span style="font-family: courier; font-size: medium;">[Program stops at breakpoint]</span></span></b><br /><b><span style="color: red;">Thread 4 "gdbThread" hit Breakpoint 1</span></b>, Suggest::suggestActivity (this=0x55555576c528) at gdbThread.cpp:16 <br /><br />16 cout<<"Suggest::suggestActivity = "<<counter<<endl;; <br /><br />
</td>
</tr>
</tbody></table></div><div style="text-align: left;"><span style="font-family: "Courier New";"><span style="color: red; font-size: large;"><b><br /></b></span></span></div><div style="text-align: left;"><span style="color: red; font-family: courier; font-size: large;"><b>Check threads status at the time of crash, breakpoint and watchpoint.</b></span></div><div><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-family: courier; font-weight: 700;"><span style="color: #2b00fe;">***IMPORTANT*** </span></span></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Here we are going to check what other threads are
doing once a thread hit breakpoint, watchpoint or crash . We shall use “info
thread” command to check thread status.</span><span style="font-family: "Courier New";"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">(gdb) info thread<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpFirst" style="margin-left: 54pt; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-ansi-language: EN-US; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">n<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span></span><!--[endif]--><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Number of
threads running at the moment.<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Here
number of thread 4. <b>Strange </b>while we
have created on 3 threads. For operating system process that is performing
main() function is also a thread.<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">1-main()
+ 3 user created.</span><span style="font-family: "Courier New";"> </span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 54pt; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-ansi-language: EN-US; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">n<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span></span><!--[endif]--><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">What is
thread id associated with a thread or <b>LWP
</b>– lightweight process<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; mso-add-space: auto;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Here
process id shown is the process Id given by operating system it not the one
returned by get_id () function of thread class.<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 54pt; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US" style="font-family: Wingdings; mso-ansi-language: EN-US; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;">n<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span></span><!--[endif]--><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Which code
statement a given thread is performing.<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpLast"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> Let check in our code, it showing all thread<br /></span></p><p class="MsoListParagraphCxSpLast"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; margin-left: -0.25pt; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 486.8pt;" valign="top" width="649">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">(gdb) <b><span style="color: red; font-size: large;">info thread </span><span style="color: #2b00fe;">[4-Threads are visible,check above point-1]</span></b><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: x-small;"> Id Target Id Frame<o:p></o:p></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span><span style="font-size: x-small;"> </span><b><span style="color: #2b00fe; font-size: medium;"> </span><span style="color: #2b00fe; font-size: large;">1</span></b><span style="font-size: x-small;"> Thread 0x7ffff7fe3740 (LWP 11075)
"gdbThread" 0x00007ffff7bbed2d in __GI___pthread_timedjoin_ex
(threadid=140737319024384,<o:p></o:p></span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: x-small;"> thread_return=0x0,
abstime=0x0, block=<optimized out>) at pthread_join_common.c:89<o:p></o:p></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span><span style="font-size: x-small;"> </span><b><span style="color: #2b00fe; font-size: medium;"> </span><span style="color: #2b00fe; font-size: large;">2</span><span style="color: #2b00fe; font-size: medium;"> </span></b><span style="font-size: x-small;"> Thread 0x7ffff6e85700 (LWP 11079)
"gdbThread" 0x000055555555517e in increment () at gdbThread.cpp:27<o:p></o:p></span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span><b style="background-color: white;"><span style="font-size: medium;"> </span><span style="color: #2b00fe;"> <span style="font-size: large;">3</span><span style="font-size: medium;"> </span></span></b></span><span style="font-size: x-small;"> Thread 0x7ffff6684700 (LWP 11080)
"gdbThread" 0x00005555555551f9 in decrement () at gdbThread.cpp:37<o:p></o:p></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span><span style="font-size: x-small;">* </span><b><span style="color: #2b00fe; font-size: large;">4</span><span style="color: #2b00fe; font-size: medium;"> </span></b><span style="font-size: x-small;"> Thread 0x7ffff5e83700
(LWP 11081) "gdbThread" Suggest::suggestActivity
(this=0x55555576c528) at gdbThread.cpp:16</span></span><o:p></o:p></span></p>
<p class="MsoListParagraph" style="line-height: normal; margin-bottom: .0001pt; margin: 0cm; mso-add-space: auto;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
</td>
</tr>
</tbody></table></div><div><span style="font-family: "Courier New";"><span style="color: red; font-size: large;"><b><br /></b></span></span></div><div style="text-align: left;"><span style="color: red; font-family: courier; font-weight: 700;"><span style="font-size: large;">Check activity of a given thread.</span><span style="font-size: medium;"> </span></span></div><div style="text-align: left;"><span style="color: #2b00fe; font-family: courier; font-weight: 700;">***IMPORTANT*** </span></div><div style="text-align: left;"><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">It is clearly visible that main() is waiting on
join(). Check following line of our code<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">in main () at gdbThread.cpp:57<o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">(gdb)<b><span style="color: red;"> <span style="font-size: large;">thread 1 </span> </span><span style="color: #2b00fe; font-size: medium;">[check thread 1]</span></b></span></p>
<br /><br />[Switching to thread 1 (Thread 0x7ffff7fe3740 (LWP 11075))] <br /><br />#0 0x00007ffff7bbed2d in __GI___pthread_timedjoin_ex (threadid=140737319024384, thread_return=0x0, abstime=0x0, block=<optimized out>) at pthread_join_common.c:89 <br /><br />89 pthread_join_common.c: No such file or directory.
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">(gdb)<span style="font-size: large;"> </span><b><span style="color: red;"><span style="font-size: large;">bt </span> </span><span style="color: #2b00fe; font-size: medium;">[Back-trace of thread 1 -<span>it is on line-57</span>]</span></b><span style="font-size: x-small;"><o:p></o:p></span></span></p>
<br /><br />#0 0x00007ffff7bbed2d in __GI___pthread_timedjoin_ex (threadid=140737319024384, thread_return=0x0, abstime=0x0, block=<optimized out>) at pthread_join_common.c:89 <br /><br />#1 0x00007ffff78ea933 in std::thread::join() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 <br /><br />#2 0x000055555555550e in main () at gdbThread.cpp:57<br /><p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">(gdb) <span style="font-size: large;">thread 3 </span> <span><o:p></o:p></span></span><b style="font-family: "Courier New";"><span style="color: #2b00fe; font-size: medium;">[check thread 3]</span></b></p>
<br /><br />[Switching to thread 3 (Thread 0x7ffff6684700 (LWP 11080))]<br />#0 0x00005555555551f9 in decrement () at gdbThread.cpp:37 <br /><br />37 if(counter%100000000 ==0)
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">(gdb)<span style="font-size: large;"> </span><b><span style="color: red;"><span style="font-size: large;">bt </span> </span></b><span><o:p></o:p></span></span><b style="font-family: "Courier New";"><span style="color: #2b00fe; font-size: medium;">[Check the status of thread 3 -<span>it is on line-37</span>]</span></b></p>
<br /><br />#0 0x00005555555551f9 in decrement () at gdbThread.cpp:37<br />#1 0x0000555555555d6d in std::__invoke_impl<void, void (*)()> (__f=@0x55555576c3d8: 0x5555555551d1 <decrement()>) at /usr/include/c++/7/bits/invoke.h:60 <br /><br />#2 0x0000555555555a06 in std::__invoke<void (*)()> (__fn=@0x55555576c3d8: 0x5555555551d1 <decrement()>) at /usr/include/c++/7/bits/invoke.h:95 <br /><br />#3 0x000055555555678a in std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul> (this=0x55555576c3d8) at /usr/include/c++/7/thread:234 <br /><br />#4 0x00005555555566fa in std::thread::_Invoker<std::tuple<void (*)()> >::operator() (this=0x55555576c3d8) at /usr/include/c++/7/thread:243 <br /><br />#5 0x0000555555556682 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > >::_M_run (this=0x55555576c3d0) at /usr/include/c++/7/thread:186 <br /><br />#6 0x00007ffff78ea6df in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 <br /><br />#7 0x00007ffff7bbd6db in start_thread (arg=0x7ffff6684700) at pthread_create.c:463 <br /><br />#8 0x00007ffff7345a3f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US"><span style="font-family: courier; font-size: xx-small;"> </span></span></p>
</td>
</tr>
</tbody></table><span style="font-family: "Courier New";"><br /></span></div><div style="text-align: left;"><span style="color: red; font-family: courier; font-size: large;"><b>How to find a thread</b></span></div><div style="text-align: left;"><span style="font-family: courier; font-size: large;"><br /></span></div><div style="text-align: left;"><div><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none;"><tbody><tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">(gdb) <b><span style="color: red; font-size: large;">thread find 11081</span></b><o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"><span style="color: #2b00fe; font-size: medium;"><b>Thread 4</b></span> has target id 'Thread 0x7ffff5e83700 (LWP 11081)'<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">(gdb) <b><span style="color: red; font-size: large;">thread find 0x7ffff6e85700</span></b><o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"><span style="color: #2b00fe; font-size: medium;"><b>Thread 2</b></span> has target id 'Thread 0x7ffff6e85700 (LWP 11079)'<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">(gdb)<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"> </span></p></td></tr></tbody></table></div><div><span style="font-family: courier; font-size: large;"><br /></span></div><div><span lang="EN-US" style="font-family: "Courier New"; line-height: 107%;"><span style="color: red; font-size: large;"><b>How to find thread with thread-id returned by get_id()</b></span></span></div></div><div style="text-align: left;"><span style="font-family: "Courier New";"><br /></span></div><div style="text-align: left;"><span style="font-family: "Courier New";">Just convert returned <b>value of get_id() to HEX digits</b> using
calculator then we can find that information in the output of “info thread”.</span></div><div style="text-align: left;"><span style="font-family: "Courier New";"><br /></span></div><div style="text-align: left;"><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">(gdb)<span style="font-size: large;"> <b><span style="color: red;">info thread</span></b></span><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> <span style="font-size: x-small;"> Id Target Id Frame<o:p></o:p></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: x-small;"> 1 Thread <b><span style="color: #2b00fe;">0x7ffff7fe3740</span></b> (LWP 11075) "gdbThread"
0x00007ffff7bbed2d in __GI___pthread_timedjoin_ex (threadid=140737319024384, </span></span><span style="font-family: "Courier New"; font-size: small;"> thread_return=0x0,
abstime=0x0, block=<optimized out>) at pthread_join_common.c:89</span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: x-small;"> 2 Thread <b><span style="color: #2b00fe;">0x7ffff6e85700</span></b> (LWP 11079) "gdbThread"
0x000055555555517e in increment () at gdbThread.cpp:27<o:p></o:p></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: x-small;"> 3 Thread <b><span style="color: #2b00fe;">0x7ffff6684700</span></b> (LWP 11080) "gdbThread" 0x00005555555551f9
in decrement () at gdbThread.cpp:37<o:p></o:p></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: x-small;">* 4 Thread <b><span style="color: #2b00fe;">0x7ffff5e83700</span></b> (LWP 11081)
"gdbThread" Suggest::suggestActivity (this=0x55555576c528) at
gdbThread.cpp:16<o:p></o:p></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: x-small;"> </span></span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Binary output: <o:p></o:p></span></b></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">main() Thread Id=<b><span style="color: #2b00fe;">0x7ffff7fe3740</span></b>
::140737354020672<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">increament() Thread Id=<b><span style="color: #2b00fe;">0x7ffff6e85700</span></b>
::140737335809792<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">decrement() Thread Id=<b><span style="color: #2b00fe;">0x7ffff6684700</span></b>
::140737327417088<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Suggest::suggestActivity() Thread Id=<b><span style="color: #2b00fe;">0x7ffff5e83700</span></b> ::140737319024384<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
</td>
</tr>
</tbody></table></div><div style="text-align: left;"><span style="font-family: courier; font-size: large;"><br /></span></div><span style="font-family: times;"><a href="https://www.techsujhav.com/2023/06/frequently-asked-interview-questions-on.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;"> Frequently Asked Interview Questions on Threads</span></a><br /><div style="text-align: center;"><a href="https://www.techsujhav.com/p/threads.html"><span style="font-size: x-large;"><b>Main Page</b></span></a></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/thread-information-linux-commands.html"><span style="font-size: medium;">Thread Information Linux Commands </span><span style="font-size: x-large;"><b>::NEXT</b></span></a></div></span><div><br /></div><div style="text-align: left;"><b style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></div><div style="text-align: left;"><p class="MsoNormal" style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b><br />So feel free to put Questions.</b></div></div><div><span style="font-family: "Courier New";"></span></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-37874508706976484902023-05-31T18:59:00.003+05:302023-07-11T18:46:42.664+05:30std::thread::join [Advanced]<p><span style="font-family: courier;"><span style="background-color: white; text-align: justify;">Here we have idea to discuss various cases where and how we should use join, in other words dos and don’ts with join(). We hope that it would be great learning for all of us.</span></span></p><p style="text-align: justify;"><span style="font-family: courier;"><span style="background-color: white;">Here we have listed down few questions, if you have some more please put them in comment section.</span></span></p><p style="text-align: justify;"><span style="font-family: Courier New; font-size: medium;"><b> </b></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; font-size: medium; mso-ansi-language: EN-US;"><b>Question:-1:</b> <a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-why-do-we-need-to.html" target="_blank">Why do we need to call join() on threadobject, although created thread has already finished its task</a>.<o:p></o:p></span></p><p style="text-align: justify;"><span style="font-family: Courier New; font-size: medium;"></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; font-size: medium; mso-ansi-language: EN-US;"><b>Question:-2:</b> <a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-why-do-we-need-to.html" target="_blank">Why does program lead to abort if join()is not called?</a><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="background-color: white; font-family: courier; font-size: medium; text-align: justify;"><b>Question:-3:</b> <a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-what-will-happen-if.html" target="_blank">What will happen if we call join again on same thread?</a></span></span></p><p style="text-align: justify;"><span style="font-family: Courier New; font-size: medium;"></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="font-size: medium;"><b>Question:-4:</b> <a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-can-we-reuse-that.html" target="_blank">Can we reuse that same thread-object for different tasks after join()?</a></span></span></p><br /><a href="https://www.techsujhav.com/2023/05/stdthreadjoin.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;"> std::thread::join</span></a><br /><div style="text-align: center;"><a href="https://www.techsujhav.com/p/threads.html"><b><span style="font-size: x-large;">Main Page</span></b></a></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-why-do-we-need-to.html"><span style="font-size: medium;">Why do we need to call join()</span><b><span style="font-size: x-large;"> ::NEXT</span></b></a></div><p class="MsoNormal"><b style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome. </b></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"></span></p><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b><br />So feel free to put Questions.</b></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-15888745184461948592023-05-31T18:44:00.003+05:302023-07-11T18:46:52.010+05:30std::thread::detach<p style="text-align: justify;"><span style="font-family: "Courier New";"><b>detach()</b> function detaches the thread-object with
execution of thread. All resource shall be release by thread once it exists
i.e. completed its tasks.</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">As we know that join() put a halt on process execution
at the point where join is called but there are certain situation where
programmer wants execution to move ahead in code and let the created thread to
do its task independently, (not waiting for thread complete its task)there we
can call detach().<o:p></o:p></span></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Example where detach can be better</span></p><p class="MsoNormal" style="text-align: justify;"></p><ul><li><span style="font-family: Courier New;">if a thread is always listening on a socket.</span></li><li><span style="font-family: Courier New;">if you want certain activity on every interval say every 5 mins.</span></li><li><span style="font-family: Courier New;">Probably an activity assigned to task where there is infinite loop then that can be detached.</span></li></ul><div><span style="color: red; font-family: Courier New; font-size: medium;"><b>std::thread::detach()[Advanced]</b> -<a href="https://www.techsujhav.com/2023/05/stdthreaddetach-advanced.html" target="_blank"><b>[Click Here]</b></a></span></div><p></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Let check following code, Moreover output how it is overlapped.</span></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;">
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">#include<iostream><o:p></o:p></span></p>
<span style="font-family: courier;">#include<thread> <br />#include<chrono> <br /><br />using namespace std; <br /><br /><span style="color: #2b00fe;"><b>//"</b></span></span><span style="color: #2b00fe;"><b>displayActivity" is the actual task<br /></b></span><span style="font-family: courier;"><span style="color: #2b00fe;"><b>//performed by detached thread</b></span><br />void displayActivity() <br />{ <br /><span> </span>for(int i=0;i<5;i++) <br /><span> </span><span> </span>cout<<"www.techsujhav.com"<<endl;<br />} <br /><br />int main() <br />{ <br /><span> </span>std::thread t1(displayActivity); <br /><br /> <span> </span>t1.detach(); <br /><br /> <span> </span>for(int i=0;i<5;i++) <br /><span> </span>{ <br /><span> </span><span> </span>cout<<"Performing Activity in main()"<<endl; <br /><span> <br /></span><span style="color: #2b00fe;"><b><span> </span><span> </span>//intentionally putting sleep of 1-neno second. <br /><span> </span><span> </span>//for better display of out example. </b></span><br /><span> </span><span> </span>std::this_thread::sleep_for(1ns); <br /><span> </span>} <br /><span> </span>return 0; <br />}</span>
</td>
</tr>
<tr style="mso-yfti-irow: 1;">
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Compile: </span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$g++
detach.cpp –o detach -lpthread<o:p></o:p></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 2; mso-yfti-lastrow: yes;">
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$ ./detach<o:p></o:p></span></b></p>
<br />Performing Activity in main() <br />Performing Activity in main() <br />www.techsujhav.com <br />www.techsujhav.com <br />www.techsujhav.com <br />www.techsujhav.com <br />www.techsujhav.com <br />Performing Activity in main() <br />Performing Activity in main() <br />Performing Activity in main()
</td>
</tr>
</tbody></table><span lang="EN-US" style="mso-ansi-language: EN-US;"><br /><span style="color: #2b00fe; font-family: times;"><a href="https://www.techsujhav.com/2023/05/stdthreadjoin-advanced.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;"> std::join() [Advanced]</span></a></span></span><div style="text-align: center;"><span lang="EN-US" style="color: #2b00fe; font-family: times; font-size: x-large; mso-ansi-language: EN-US;"><a href="https://www.techsujhav.com/p/threads.html"><b>Main Page</b></a></span></div><div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/05/stdthreaddetach-advanced.html" style="font-family: times;"><span style="font-size: medium;">std::detach()[Advanced] </span><b><span style="font-size: x-large;">::NEXT</span></b></a></div><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b style="background-color: white; font-family: georgia; font-size: 13.2px; text-align: start;">Your Comments /Suggestions & Questions are always welcome.<br />We would like to help you with best of our knowledge.<br />So feel free to put Questions.</b></span></p></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-48241003381310874842023-05-31T18:41:00.007+05:302023-07-11T18:47:02.295+05:30std::thread::detach [Advanced]<p style="text-align: justify;"><span style="font-family: courier;">Main idea of this section to discuss various use cases of detach(), d's and don'ts of detach function. </span></p><p style="text-align: justify;"><span style="font-family: courier;">Let check followings open items. <b>if you have some question then you can put them in comment section.</b></span></p><p style="text-align: justify;"></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Question-1: <b>What will happen if main thread exits before detached
thread finished its assigned task?</b></span></p><p class="MsoNormal"><span style="font-family: courier;">Question-2: <span style="text-align: left;"><b>Can we rejoin a detached thread?</b></span></span></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><span style="font-family: "Courier New";"><b><span style="color: red; font-size: large;">Question-1: What will happen if main thread exits before detached thread finished its assigned task?</span></b></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Detach thread shall be stopped there itself and all
acquired resources shall be freed. Let check with following example. </span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b>[Copy, Paste & Run]</b></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">#include<iostream></span><br style="font-family: courier;" /><span style="font-family: courier;">#include<thread></span><br style="font-family: courier;" /><span style="font-family: courier;">#include<chrono></span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;">using namespace std;</span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;">void displayActivity()</span><br style="font-family: courier;" /><span style="font-family: courier;">{</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">for(int i=0;i<5;i++)</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">{</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"www.techsujhav.com :: "<<i<<endl;</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">std::this_thread::sleep_for(1ns);</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">}</span><br style="font-family: courier;" /><span style="font-family: courier;">}</span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;">int main()</span><br style="font-family: courier;" /><span style="font-family: courier;">{</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">{//new scope</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">std::thread t1(displayActivity);</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">t1.detach();</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">}</span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">for(int i=0;i<3;i++)</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">{</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"Performing Activity in main()"<<endl;</span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">//intentionally putting sleep of 1-neno second.</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">//for better display of out example.</span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">std::this_thread::sleep_for(1ns);</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">}</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">return 0;</span><br style="font-family: courier;" /><span style="font-family: courier;">}</span></p></td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span><b><span lang="EN-US" style="font-family: "Courier New";">$</span><span lang="EN-US" style="font-family: "Courier New";"> ./detach</span></b></p><p class="MsoNormal"><span style="font-family: courier;">Performing Activity in main()</span></p><p class="MsoNormal"><span style="font-family: courier;">www.techsujhav.com :: 0</span></p><p class="MsoNormal"><span style="font-family: courier;">Performing Activity in main()</span></p><span style="font-family: courier;">www.techsujhav.com :: 1<br /><br />Performing Activity in main()<br /><br />www.techsujhav.com :: 2</span>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span><b style="font-family: "Courier New";">Explanation:</b></p><p></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">As it is clearly visible that </span><a href="http://www.techsujhav.com/"><span color="windowtext" lang="EN-US" style="font-family: "Courier New"; text-decoration-line: none;">www.techsujhav.com</span></a><span lang="EN-US" style="font-family: "Courier New";"> :: 3 and www.techsujhav.com :: 4 were not printed because main exited before our displayActivity thread could finish its activity.</span></p><p style="text-align: justify;"></p>
</td>
</tr>
</tbody></table><br /><p class="MsoNormal"><br /></p><p class="MsoNormal"><span style="color: red; font-size: large;"><b><span style="font-family: courier;">Question-2: </span><span style="font-family: courier; text-align: left;">Can we rejoin a detached thread?</span></b></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">No it is not possible to join a thread once we have
called detach() function on that object. It will throw an exception.<o:p></o:p></span></p><p></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;">
</p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">As we know if we want to call join() on a
thread-object object then that thread object must be ACTIVE (joinable() ==
true).<o:p></o:p></span></p><p class="MsoNormal"><span style="font-family: Courier New;">Let check with example</span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"><tbody><tr><td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><span style="font-family: courier;">#include<iostream> <br />#include<thread> <br />#include<chrono> <br /><br />using namespace std; <br /><br />void displayActivity() <br />{ <br /><span> </span>for(int i=0;i<5;i++) <br /><span> </span>{ <br /><span> </span><span> </span>cout<<"www.techsujhav.com :: "<<i<<endl; <br /><span> </span><span> </span>std::this_thread::sleep_for(1ns); <br /><span> </span>} <br />} <br /><br />int main() <br />{ <br /><br /> <span> </span>{<span style="color: #2b00fe;"><b>//new scope </b></span><br /><span> </span><span> </span>std::thread t1(displayActivity); <br /><span> </span><span> </span>cout<<"Going to call detach()"<<endl; <br /><br /> <span> </span><span> </span>t1.detach(); <br /><br /> <span> </span><span> </span>try <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>cout<<"Going to call join()"<<endl; <br /><span> </span><span> </span><span> </span>t1.join(); <br /><span> </span><span> </span>} <br /><span> </span><span> </span>catch(std::exception& e) <br /><span> </span><span> </span>{ <br /><span> </span><span> </span><span> </span>cout<<"Exception Caught :: "<<e.what()<<endl; <br /><span> </span><span> </span>} <br /><span> </span>} <br /><span> </span>return 0; <br />}</span>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$./detach<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going to call detach()<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going to call join()<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Exception Caught :: Invalid argument<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">www.techsujhav.com :: 0<o:p></o:p></span></p>
</td>
</tr>
</tbody></table><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span style="color: #2b00fe; font-family: times;"><b><span style="font-size: x-large;">PREV:: </span></b><span style="font-size: medium;">std::thread::detach()</span></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-align: center;"><span style="color: #2b00fe; font-family: times; font-size: x-large;"><b><a href="https://www.techsujhav.com/p/threads.html">Main Page</a></b></span></p><br /><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/how-to-call-function-with-reference.html" style="font-size: large;">Call function with Reference Variable, Default Argument </a></div><div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/06/how-to-call-function-with-reference.html"><span style="font-size: medium;">and Pointer Variable from thread</span><b><span style="font-size: x-large;">::NEXT</span></b></a></div><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b style="background-color: white; font-family: georgia; font-size: 13.2px;">Your Comments /Suggestions & Questions are always welcome.</b></p><p class="MsoNormal"><b style="background-color: white; font-family: georgia; font-size: 13.2px; text-align: start;">We would like to help you with best of our knowledge.</b></p><p class="MsoNormal"><b style="background-color: white; font-family: georgia; font-size: 13.2px; text-align: start;">So feel free to put Questions.</b></p><span style="font-family: courier;"></span><p></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><o:p></o:p></span></p></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com2tag:blogger.com,1999:blog-3141648627189840539.post-89275905182329837032023-05-31T14:36:00.013+05:302023-07-11T18:47:15.298+05:30std::thread::join<p style="text-align: justify;"><span style="font-size: medium;"><span style="font-family: courier;"><b>join():</b></span> <span style="font-family: "Courier New";">It basically temporarily halts the execution at the
point where join() function is called till the thread associated with the
<b>calling object i.e. t_obj</b> completes its task.</span><span style="font-family: "Courier New";"> </span></span></p><p style="text-align: justify;"><span style="font-size: medium;"><span style="font-family: Courier New;"><br /></span></span></p><p style="text-align: justify;"><span style="font-size: medium;"><span style="color: red; font-family: Courier New;"><b>std::thread::join [Advanced] -- <a href="https://www.techsujhav.com/2023/05/stdthreadjoin-advanced.html" target="_blank">[Click Here]</a></b></span></span></p><p style="text-align: justify;"><span style="font-size: medium;"><span style="color: red; font-family: Courier New;"><br /></span></span></p><p style="text-align: justify;"><span style="font-size: medium;"><span style="font-family: Courier New;">Let’s check the below examples.</span></span></p><p style="text-align: justify;"><span style="font-family: Courier New; font-size: medium;"><b>Suggestion:- </b>it would be great, if you <b>copy</b> following code and <b>paste</b> it on any online compiler (or vi/vim) <b>and</b> try to <b>run</b> it by your-self</span></p><p style="text-align: justify;"><span style="font-family: Courier New; font-size: medium;"><br /></span></p><p style="text-align: justify;"><span style="font-family: Courier New; font-size: medium;"><br /></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none;"><tbody><tr><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"><b>Case-1: join() is not called</b><o:p></o:p></span></p></td><td style="border-bottom: 1pt solid windowtext; border-image: initial; border-left: none; border-right: 1pt solid windowtext; border-top: 1pt solid windowtext; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"><b>Case-2: join() is called</b><o:p></o:p></span></p></td></tr><tr><td style="border-bottom: 1pt solid windowtext; border-image: initial; border-left: 1pt solid windowtext; border-right: 1pt solid windowtext; border-top: none; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span style="font-family: courier;">#include<iostream><br />#include<thread> <span style="color: #2b00fe;"><b>//Thread Header</b></span></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span style="text-align: justify;"><span style="font-family: courier;">using namespace std;</span></span></p><span style="font-family: courier;"><br /><span style="color: #2b00fe;"><b>//“displayActivity” is the actual task<br />//to be performed by our thread</b></span><br /><br /><span>void displayActivity()</span><br /><span>{</span><br /><span> for(int i=0;i<10;i++)</span><br /><span> cout<<"www.techsujhav.com : "<<i<<endl;</span><br /><span>}</span><br /><br /><span>int main()</span><br /><span>{</span><br /><span> cout<<"Going to start thread"<<endl;</span><br /><span> std::thread t_obj(displayActivity);</span><br /><br /><b><span style="color: #2b00fe;"> //join() is intentionally commented<br /> //to check the behaviour of our code<br /><br /> //t_obj.join();</span></b><br /><br /><span> cout<<"Main exit"<<endl;</span><br /><span> return 0;</span><br /><span>}</span></span></td><td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><span style="font-family: courier;"><span>#include<iostream></span><br /><span>#include<thread> //Thread Header</span><br /><br /><span>using namespace std;</span><br /><br /><span style="color: #2b00fe;"><b>//“displayActivity” is the actual task<br />//to be performed by our thread</b></span><br /><br /><span>void displayActivity()</span><br /><span>{</span><br /><span> for(int i=0;i<5;i++)</span><br /><span> cout<<"www.techsujhav.com : "<<i<<endl;</span><br /><span>}</span><br /><br /><br /><span>int main()</span><br /><span>{</span><br /><span> cout<<"Going to start thread"<<endl;</span><br /><span> std::thread t_obj(displayActivity);</span><br /><span> </span><br /><span> cout<<"Before Join"<<endl;</span><br /><span> </span><b><span style="color: #2b00fe;">t_obj.join();</span></b><br /><span> cout<<"After Join"<<endl;</span><br /><span> cout<<"Main exit"<<endl;</span><br /><br /><span> return 0;</span><br /><span>}</span></span></td></tr><tr><td style="border-bottom: 1pt solid windowtext; border-image: initial; border-left: 1pt solid windowtext; border-right: 1pt solid windowtext; border-top: none; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";">Compile:</span></b><span lang="EN-US" style="font-family: "Courier New";"><br />$g++ join.cpp -o join -lpthread<o:p></o:p></span></p></td><td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";">Compile:</span></b><span lang="EN-US" style="font-family: "Courier New";"><br />$g++ join.cpp -o join -lpthread<o:p></o:p></span></p></td></tr><tr style="height: 73.9pt;"><td style="border-bottom: 1pt solid windowtext; border-image: initial; border-left: 1pt solid windowtext; border-right: 1pt solid windowtext; border-top: none; height: 73.9pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";">Output:</span></b><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt;">$ ./join</span><b><span lang="EN-US" style="font-family: "Courier New";"><o:p></o:p></span></b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt;"> </span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">Going to start thread<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">Main exit<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="color: red; font-family: "Courier New";"><span style="font-size: medium;">terminate called without an active exception</span><o:p></o:p></span></b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="color: red; font-family: "Courier New";"><span style="font-size: medium;">Aborted</span></span></b><b><span lang="EN-US" style="font-family: "Courier New";"><o:p></o:p></span></b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";"> </span></b></p></td><td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; height: 73.9pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";">Output:$ </span></b><span lang="EN-US" style="font-family: "Courier New";">./join<b><o:p></o:p></b></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt;"> </span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">Going to start thread<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">Before Join<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">www.techsujhav.com : 0<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">www.techsujhav.com : 1<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">www.techsujhav.com : 2<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">www.techsujhav.com : 3<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">www.techsujhav.com : 4<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">After Join<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">Main exit<span style="font-size: 9pt;"><o:p></o:p></span></span></p></td></tr><tr style="height: 73.9pt;"><td style="border-bottom: 1pt solid windowtext; border-image: initial; border-left: 1pt solid windowtext; border-right: 1pt solid windowtext; border-top: none; height: 73.9pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";">Observation (1):<o:p></o:p></span></b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"><b><span lang="EN-US" style="font-family: "Courier New";">We are not able to see any print from our task "</span></b><span lang="EN-US"><span style="font-family: courier;">displayActivity" assigned to thread object. Although all other prints are visible from main ()<span style="color: #0070c0;">.</span></span><span style="color: #0070c0; font-family: Courier New; font-size: 8pt;"><o:p></o:p></span></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-align: justify;"><span lang="EN-US" style="color: #0070c0; font-family: "Courier New"; font-size: 8pt;"> </span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US"><span style="font-family: courier;"><b>Explanation:</b></span><span style="color: #0070c0; font-family: "Courier New"; font-size: 8pt;"><o:p></o:p></span></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">Once our thread object t_obj is created with “displayActivity” passed in constructor it notifies to OS (Operation System) to create a thread and constructor call finished and moved ahead for next instruction in main().<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"> </span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">OS shall take some time (may be in nano-second) to create a thread, meanwhile main() has finished its activity and exited, therefore we don’t have any print of our task “displayActivity”<span style="color: #0070c0; font-size: 8pt;"><o:p></o:p></span></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="color: #0070c0; font-family: "Courier New"; font-size: 8pt;"> </span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="color: #0070c0; font-family: "Courier New"; font-size: 8pt;"> </span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";">Observation(2):<o:p></o:p></span></b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="color: red; font-family: "Courier New";">terminate called without an active exception<o:p></o:p></span></b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="color: red; font-family: "Courier New";">Aborted</span></b><b><span lang="EN-US" style="font-family: "Courier New";"><o:p></o:p></span></b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";"> </span></b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><b><span lang="EN-US" style="font-family: "Courier New";">Explanation:<o:p></o:p></span></b></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">Will discuss in<b> Advanced </b>section of this post<b><o:p></o:p></b></span></p></td><td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; height: 73.9pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"><b>Observation:</b><o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">Our code worked as expected.<o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"> </span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"><b>join() function halts execution of main and let the thread to finish assigned task.</b><o:p></o:p></span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"> </span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";">More important to observe it that join() makes main to wait at the line it(join) is called.</span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt;"><o:p></o:p></span></p></td></tr></tbody></table><p style="text-align: justify;"><a href="https://www.techsujhav.com/2023/05/stdthreadgetid.html"><span style="font-size: x-large;">PREV::</span><span style="font-size: medium;"> std::thread::get_id()</span></a></p><div style="text-align: center;"><span style="font-size: x-large;"><a href="https://www.techsujhav.com/p/threads.html">Main Page</a></span></div><div style="text-align: right;"><a href="https://www.techsujhav.com/2023/05/stdthreadjoin-advanced.html"><span style="font-size: medium;">std::thread::join[Advanced]</span><b><span style="font-size: x-large;"> ::NEXT</span></b></a></div><p style="text-align: justify;"><b style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: start;">Your Comments /Suggestions & Questions are always welcome. </b></p><p style="text-align: justify;"><b style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: left;">We would like to help you with best of our knowledge.</b></p><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b>So feel free to put Questions.</b></div><p style="text-align: justify;"><br /></p>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-76773018515511733712023-05-31T14:24:00.002+05:302023-07-11T18:47:25.950+05:30thread::join [Advanced]- Can we reuse that same thread object for different tasks after join()?<p><span style="color: red; font-family: courier;"><b>Question-4: Can we reuse that same thread object for different tasks after join()?</b></span></p><p><span style="font-family: courier;">Yes we can use same thread object to call 3 different task one after other as given in following example.</span></p><p><span style="font-family: courier;">For better understanding please <b>copy and paste</b> given code and try to run by yourself.</span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><span style="font-family: courier;">#include<iostream> <br />#include<thread> //Thread Header <br />#include<chrono> <br /><br />using namespace std; <br /><br />//actual task to be performed <br />//by our thread <br />void displayActivity() <br />{ <br /><span> </span>cout<<"www.techsujhav.com : "<<endl; <br /><span> </span>std::this_thread::sleep_for(60s); <br />} <br /><br />void displayTask() <br />{ <br /><span> </span>cout<<"www.techsujhav.com : New Task"<<endl; <br /><span> </span>std::this_thread::sleep_for(60s); <br />} <br /><br />int main() <br />{ <br /><span> </span>cout<<"Going to start thread"<<endl; <br /><span> {//</span>New scope started. <br /><span> </span><span> </span>std::thread t_obj(displayActivity); <br /><span> </span><span> </span>cout<<"Thread Id ="<<t_obj.get_id()<<endl; <br /><br /> <span> </span><span> </span>cout<<"Before Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl; <br /><span> </span><span> </span>t_obj.join(); <br /><br /><span> </span><span> </span>cout<<"After Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl<<endl; <br /><br /><span> </span><span> </span>cout<<"REUSING Thread Object"<<endl; <br /><br /> <span> </span><span> </span>t_obj=std::thread(displayActivity); <br /><span> </span><span> </span>cout<<"*** Thread Id ="<<t_obj.get_id()<<endl; <br /><span> </span><span> </span>cout<<"*** Before Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl; <br /><br /><span> </span><span> </span>t_obj.join(); <br /><br /><span> </span><span> </span>cout<<"***After Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl<<endl; <br /><span> </span><span> </span>cout<<"REUSING Thread Object with NEW Task"<<endl; <br /><br /> <span> </span><span> </span>t_obj=std::thread(displayTask); <br /><span> </span><span> </span>cout<<"### Thread Id ="<<t_obj.get_id()<<endl; <br /><br /> <span> </span><span> </span>cout<<"### Before Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl; <br /><br /><span> </span><span> </span>t_obj.join(); <br /><br /><span> </span><span> </span>cout<<"### After Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl<<endl; <br /><span> </span><span> </span>cout<<"Going out of scope"<<endl; <br /><span> </span>}<span> </span><span> </span><br /><span> </span>cout<<"Main Exit"<<endl; <br /><span> </span>return 0; <br />}</span>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">TechSujhav@TEAM:~/thread$ ./join<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going to start thread<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="color: #2b00fe;">Thread Id
=140527220852480</span><o:p></o:p></span></b></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Before Join, (ACTIVE) joinable=1<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">www.techsujhav.com :<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">After Join, (ACTIVE) joinable=0<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">REUSING Thread Object<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="color: #2b00fe;">*** Thread Id
=140527220852480</span><o:p></o:p></span></b></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">*** Before Join, (ACTIVE) joinable=1<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">www.techsujhav.com :<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">***After Join, (ACTIVE) joinable=0<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">REUSING Thread Object with NEW Task<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="color: #2b00fe;">### Thread Id =140527220852480</span><o:p></o:p></span></b></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">### Before Join, (ACTIVE) joinable=1<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">www.techsujhav.com : New Task<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">### After Join, (ACTIVE) joinable=0<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going out of scope<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Main Exit<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Explanation:<o:p></o:p></span></b></p>
<br /><span style="font-family: courier;">Important thing to note here is thread Id is same in all 3 calls. Because we are using the same thread-object in every call</span>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">However, it does not imply that same thread is used by operating
system, every time a new thread is generated. We can check this on any Linux
system.<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: "Courier New";">If you running following commands from other terminal, you would come
to know. Please check below output.</span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">TechSujhav@TEAM:~$ ps –ef |grep –i join <o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><to get process id of ./join></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">TechSujhav@TEAM:~$ top -H -p 43835 < process id of ./join ><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">top - 21:48:21</span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> up 187
days, 21:21, 4 users, load average: 0.00, 0.00, 0.00<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Threads: 2 total, 0 running, 2 sleeping, 0 stopped, 0 zombie<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">%Cpu(s): 0.0 us, 0.0 sy,
0.0 ni,100.0 id, 0.0 wa, 0.0 hi,
0.0 si, 0.0 st<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">KiB Mem : 19772300+total, 59427144 free, 1011180 used, 13728468+buff/cache<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">KiB Swap: 8388604 total, 8347236 free, 41368 used. 19526404+avail Mem<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> PID USER PR
NI VIRT RES
SHR S %CPU %MEM TIME+
COMMAND<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">43835 TechSujhav 20 0
24376 1888 1736 S
0.0 0.0 0:00.00 join<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b><span style="color: #2b00fe;">43836 TechSujhav 20 0
24376 1888 1736 S
0.0 0.0 0:00.00 join</span></b><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">top - 21:48:45</span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> up 187
days, 21:22, 4 users, load average: 0.00, 0.00, 0.00<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Threads: 2 total, 0 running, 2 sleeping, 0 stopped, 0 zombie<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">%Cpu(s): 0.0 us, 0.0 sy,
0.0 ni,100.0 id, 0.0 wa, 0.0 hi,
0.0 si, 0.0 st<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">KiB Mem : 19772300+total, 59427972 free, 1010344 used, 13728468+buff/cache<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">KiB Swap: 8388604 total, 8347236 free, 41368 used. 19526488+avail Mem<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> PID USER PR
NI VIRT RES
SHR S %CPU %MEM TIME+
COMMAND<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">43835 TechSujhav 20 0
89912 1956 1800 S
0.0 0.0 0:00.00 join<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="color: #2b00fe;"><b>44291 TechSujhav 20 0
89912 1956 1800 S
0.0 0.0 0:00.00 join</b></span><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">top - 21:49:51</span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> up 187
days, 21:23, 4 users, load average: 0.00, 0.00, 0.00<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Threads: 2 total, 0 running, 2 sleeping, 0 stopped, 0 zombie<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">%Cpu(s): 0.0 us, 0.0 sy,
0.0 ni,100.0 id, 0.0 wa, 0.0 hi,
0.0 si, 0.0 st<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">KiB Mem : 19772300+total, 59428580 free, 1009708 used, 13728472+buff/cache<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">KiB Swap: 8388604 total, 8347236 free, 41368 used. 19526552+avail Mem<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> PID USER PR
NI VIRT RES
SHR S %CPU %MEM TIME+
COMMAND<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">43835 TechSujhav 20 0
89912 1956 1800 S
0.0 0.0 0:00.00 join<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b><span style="color: #2b00fe;">44651 TechSujhav 20 0
89912 1956 1800 S
0.0 0.0 0:00.00 join</span></b><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
</td>
</tr>
</tbody></table><p><span style="font-family: courier;"><b style="color: red; font-size: large; text-align: justify;"><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-what-will-happen-if.html" target="_blank">Question -3: <span>What will happen if we call join again on same thread?</span></a></b></span><br /><br /><a href="#"></a><br /><br /><span style="color: #2b00fe;"><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-what-will-happen-if.html"><b><span style="font-size: x-large;">PREV:: </span></b><span style="font-size: medium;">What will happen if we call join again on same thread.</span></a><br /></span></p><div style="text-align: center;"><span style="color: #2b00fe;"><a href="https://www.techsujhav.com/p/threads.html"><span style="font-size: x-large;"><b>Main Page</b></span></a></span></div><div style="text-align: right;"><span style="color: #2b00fe;"><a href="https://www.techsujhav.com/2023/05/stdthreaddetach.html"></a><a href="https://www.techsujhav.com/2023/05/stdthreaddetach.html"><span style="font-size: medium;">std::thread::detach() </span><b><span style="font-size: x-large;">:: NEXT</span></b></a></span></div><p></p><b>Your Comments /Suggestions & Questions are always welcome.<br /><br />We would like to help you with best of our knowledge.<br /><br />So feel free to put Questions.</b>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-89410218940864742242023-05-31T13:58:00.006+05:302023-07-11T18:47:34.654+05:30thread::join [Advanced] - What will happen if we call join again on same thread.<p style="text-align: justify;"><span style="color: red; font-family: courier; font-size: medium;"><b>Question -3: <span>What will happen if we call join again on same thread?</span></b></span></p><p style="text-align: justify;"><span style="font-family: courier;">It shall lead us to crash if not handled properly. Let check with following example and then will see best practice to use join()</span></p><p style="text-align: justify;"><span style="font-family: courier;"><b>Case-1:</b> Exception is not caught therefore lead of Abort.</span></p><p style="text-align: left;"><span style="font-family: courier;"><b>Case-2: </b>Exception is caught properly lead to normal execution and termination.</span></p><p style="text-align: justify;"><span style="font-family: courier;"><b>Case-3:</b> Best practice to use join(), is to check with whether it is joinable() or not</span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-table-layout-alt: fixed; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 262pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Case-1: Join called
again <o:p></o:p></span></b></p>
</td>
<td style="border-left: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 9cm;" valign="top" width="340">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Case-2: Join called
with try-catch<o:p></o:p></span></b></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 262pt;" valign="top" width="349"><span style="font-family: courier; font-size: x-small;">#include<iostream> <br />#include<thread> <b><span style="color: #2b00fe;">//Thread Header </span></b><br />#include<chrono> <br /><br />using namespace std; <br /><br /><span style="color: #2b00fe;"><b>//actual task to be performed <br />//by our thread </b></span><br /><br />void displayActivity() <br />{ <br />cout<<"www.techsujhav.com : "<<endl; <br />} <br /><br />int main() <br />{ <br /> cout<<"Going to start thread"<<endl;<br /> {//New scope started. <br /> std::thread t_obj(displayActivity); <br /><br /> cout<<"Before Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl; <br /><br /> t_obj.join(); <br /><br /> cout<<"After Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl<<endl; <br /><br /><span> </span><span> </span><b><span style="color: #2b00fe;">//.................................. <br /><span> </span><span> </span>//.................................. <br /><br /> //Large code is written <br /> //By-mistake if programmer calls join again() <br /><br /> //................................ <br /> //................................ </span></b><br /><br /> t_obj.join(); <br /> cout<<"Going out of scope"<<endl; <br /><br /> }<br /><br /> cout<<"Main Exit"<<endl; <br /> return 0; <br />}
</span></td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 9cm;" valign="top" width="340"><span style="font-family: courier; font-size: x-small;">#include<iostream> <br />#include<thread> <b><span style="color: #2b00fe;">//Thread Header </span></b><br />#include<chrono> <br /><br />using namespace std; <br /><br /><span style="color: #2b00fe;"><b>//actual task to be performed <br />//by our thread </b></span><br /><br />void displayActivity() <br />{ <br />cout<<"www.techsujhav.com : "<<endl; <br />} <br /><br />int main() <br />{ <br /> cout<<"Going to start thread"<<endl;<br /> {//New scope started.<br /> std::thread t_obj(displayActivity); <br /><br /> cout<<"Before Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl; <br /><br /> t_obj.join(); <br /><br /> cout<<"After Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl<<endl; <br /><br /><br /><span style="color: #2b00fe;"><b> //........................ <br /> //........................ <br /><br /> //Large code is written <br /> //By-mistake if programmer calls join again() <br /><br /> //........................<br /> //........................ </b></span><br /><br /> try <br /> { <br /> t_obj.join(); <br /> } <br /> catch(std::exception& e) <br /> { <br /> cout<<"Exception :: "<<e.what()<br /><span> </span><span> </span><<endl;<br /> } <br /> catch(...) <br /> { <br /> cout<<"Exception"<<endl; <br /> }<br /> cout<<"Going out of scope"<<endl; <br /> } <br /> cout<<"Main Exit"<<endl; <br /> return 0; <br />}
</span></td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 262pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b>$./join</b><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going to start thread<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Before Join, (ACTIVE) joinable=1<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">www.techsujhav.com :<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">After Join, (ACTIVE) joinable=0<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b><span style="color: red;">terminate called after throwing an instance of 'std::system_error'<o:p></o:p></span></b></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b><span style="color: red;"> what(): Invalid argument<o:p></o:p></span></b></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b><span style="color: red;">Aborted</span></b><o:p></o:p></span></p>
</td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 9cm;" valign="top" width="340">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b>$ ./join</b><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going to start thread<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Before Join, (ACTIVE) joinable=1<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">www.techsujhav.com :<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">After Join, (ACTIVE) joinable=0<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Exception :: Invalid argument<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going out of scope<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Main Exit<o:p></o:p></span></p>
</td>
</tr>
</tbody></table><p style="text-align: justify;"><span style="font-family: courier;"><br /></span></p><p style="text-align: justify;"><b style="font-family: courier;">Case-3:</b><span style="font-family: courier;"> Best practice to use join(), is to check with whether it is joinable() or not</span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><o:p> </o:p><b><span lang="EN-US" style="font-family: "Courier New";">Best Practice: Is to check whether it is joinable() or not</span></b></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span style="font-family: courier;">#include<iostream></span></p><span style="font-family: courier;">#include<thread> //Thread Header</span><br style="font-family: courier;" /><span style="font-family: courier;">#include<chrono></span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;">using namespace std;</span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;">//actual task to be performed</span><br style="font-family: courier;" /><span style="font-family: courier;">//by our thread</span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;">void displayActivity()</span><br style="font-family: courier;" /><span style="font-family: courier;">{</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"www.techsujhav.com : "<<endl;</span><br style="font-family: courier;" /><span style="font-family: courier;">}</span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;">int main()</span><br style="font-family: courier;" /><span style="font-family: courier;">{</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"Going to start thread"<<endl;</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">{//New scope started.</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">std::thread t_obj(displayActivity);</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"Before Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl;</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="color: #04ff00; font-family: courier;"><b> </b><b>if(t_obj.joinable())<br /> {<br /> t_obj.join();<br /> }<br /> else<br /> cout<<"Not-Valid to call join() on thread object"<<endl;</b></span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"After Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl;</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">//...........................................</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">//...........................................</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">//Large code is written</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">//By-mistake if programmer calls join again()</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">//.........................................</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">//.........................................</span><br style="font-family: courier;" /><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">try</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">{</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="color: #04ff00; font-family: courier;"><b> if(t_obj.joinable())<br /> {<br /> t_obj.join();<br /> }<br /> else<br /> cout<<"Not-Valid to call join() on thread object"<<endl;</b></span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">}</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">catch(std::exception& e)</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">{</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"Exception :: "<<e.what()<<endl;</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">}</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">catch(...)</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">{</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"Exception"<<endl;</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">}</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"Going out of scope"<<endl;</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">}</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">cout<<"Main Exit"<<endl;</span><br style="font-family: courier;" /><span style="font-family: courier;"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;">return 0;</span><br style="font-family: courier;" /><span style="font-family: courier;">}</span>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><o:p> </o:p><b style="font-family: "Courier New";">$./join</b></p><br /><br /><span style="font-family: courier;">Going to start thread<br />Before Join, (ACTIVE) joinable=1<br />www.techsujhav.com :<br />After Join, (ACTIVE) joinable=0<br /><br /><span style="color: #04ff00;"><b>Not-Valid to call join() on thread object</b></span><br />Going out of scope<br />Main Exit</span>
</td>
</tr>
</tbody></table><br /><br /><br /><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="color: red; font-size: medium;"><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-why-do-we-need-to.html" target="_blank"><b>Question:-1, Why do we need to call join() on thread object, although created thread has already finished its task?</b><o:p></o:p></a></span></span></p><p class="MsoNormal"><b style="font-family: "Courier New";"><span style="color: red; font-size: medium;"><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-why-do-we-need-to.html" target="_blank">Question:-2, Why does program lead to abort if join() is not called?</a></span></b></p><br /><span style="font-size: medium;"><b style="color: red; font-family: courier;"><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-can-we-reuse-that.html" target="_blank">Question-4: Can we reuse that same thread object for different tasks after join()?</a></b><br /></span><br /><span style="font-family: times;"><br /><span style="color: #2b00fe;"><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-why-do-we-need-to.html"><b><span style="font-size: x-large;">PREV::</span> </b><span style="font-size: medium;">Why do we need to call join()?</span></a></span></span><div style="text-align: center;"><span style="color: #2b00fe; font-family: times; font-size: x-large;"><b><a href="https://www.techsujhav.com/p/threads.html">Main Page</a></b></span></div><div style="text-align: right;"><span style="color: #2b00fe; font-family: times;"><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-can-we-reuse-that.html"><span style="font-size: medium;">Can we reuse that same thread object for different tasks after join() </span><b><span style="font-size: x-large;">::NEXT</span></b></a></span></div><div><br /><br /><span style="font-family: georgia;"><b>Your Comments /Suggestions & Questions are always welcome. <br />We would like to help you with best of our knowledge.<br />So feel free to put Questions.</b></span></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-42625005279963661222023-05-31T12:49:00.007+05:302023-07-11T18:47:45.048+05:30thread::join [Advanced] - Why do we need to call join() on thread object?<p style="text-align: justify;"><b style="color: red; font-family: "Courier New"; font-size: large; text-align: left;">Question:-1, Why do we need to call join() on thread
object, although created thread has already finished its task?</b></p><p class="MsoNormal"><b style="font-family: "Courier New";"><span style="color: red; font-size: medium;">Question:-2, Why does program lead to abort if join()
is not called?</span></b></p><p class="MsoNormal"><b style="font-family: "Courier New";"><span style="color: red; font-size: medium;">Question:-3, Is it necessary to call join() or detach() on a thread Object?</span></b></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b>Explanation:</b><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Thread remain in ACTIVE state even though it has
finished its assigned task. [<a href="https://www.techsujhav.com/2023/05/stdthreadjoinable.html" target="_blank">Just scroll through the joinable () section</a>]<o:p></o:p></span></p><span style="font-family: "Courier New";"></span><p></p><p class="MsoNormal">
</p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Now if we do not call join() then state remains active
i.e. joinable() == true and hence once thread-object goes out of scope it will
call it’s destructor and inside the destructor there is check that if joinable() == true then call std::teriminate.
Our program will stopped abruptly there itself.<o:p></o:p></span></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"></span></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b><u>NOTE:-</u></b> It is important to observe that every
event/operation (join/detach/joinable etc.) happening with <b style="mso-bidi-font-weight: normal;"><u>thread-object</u></b>, not with thread that Operating System is running.<o:p></o:p></span></p><p></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> <b>Failure Case<o:p></o:p></b></span></p>
</td>
<td style="border-left: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b> Success case</b><o:p></o:p></span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><span style="font-family: courier; font-size: x-small;">#include<iostream><br />#include<thread> <b><span style="color: #2b00fe;">//Thread Header </span></b><br /><br />using namespace std; <br /><br /><b><span style="color: #2b00fe;">//actual task to be performed <br />//by our thread </span></b><br /><br />void displayActivity() <br />{<br /> cout<<"www.techsujhav.com : "<<endl; <br />} <br /><br />int main() <br />{ <br /> cout<<"Going to start thread"<<endl; <br /><br /> {</span><span style="font-family: courier;"><b><span style="color: #2b00fe;">//New scope started. </span></b><br /><br /><span style="font-size: x-small;"> std::thread t_obj(displayActivity); </span><br /><br /><span style="font-size: x-small;"> </span><span style="color: #2b00fe;"><b> </b><b><span style="font-size: x-small;">//Below for loop just to consume time <br /> //to show that "displayActivity" finished </span></b></span><br /><span style="font-size: x-small;"> for(int i=0; i<900000000;i++); </span><br /><br /><span style="font-size: x-small;"> cout<<"Going out of scope"<<endl; </span><br /><br /><span style="font-size: x-small;"> }</span><b><span style="color: #2b00fe;">//<--program aborted here only</span></b><br /><br /><span style="font-size: x-small;"> cout<<"Main Exit"<<endl; </span><br /><br /><span style="font-size: x-small;"> return 0; </span><br /><br /><span style="font-size: x-small;">}
</span></span></td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349"><span style="font-family: courier;"><span style="font-size: x-small;">#include<iostream> </span><br /><span style="font-size: x-small;">#include<thread> //Thread Header </span><br /><br /><span style="font-size: x-small;">using namespace std; </span><br /><br /><span style="font-size: x-small;">//actual task to be performed </span><br /><span style="font-size: x-small;">//by our thread </span><br /><br /><span style="font-size: x-small;">void displayActivity() </span><br /><span style="font-size: x-small;">{</span><br /><span style="font-size: x-small;"> cout<<"www.techsujhav.com : "<<endl; </span><br /><span style="font-size: x-small;">} </span><br /><br /><span style="font-size: x-small;">int main() </span><br /><span style="font-size: x-small;">{ </span><br /><span style="font-size: x-small;"> cout<<"Going to start thread"<<endl; </span><br /><span style="font-size: x-small;"> </span><br /><span style="font-size: x-small;"> {</span><span style="color: #2b00fe;"><b>//New scope started. </b></span><br /><br /><span style="font-size: x-small;"> std::thread t_obj(displayActivity); </span><br /><span style="font-size: x-small;"> cout<<"Before Join, (ACTIVE) joinable=" <<t_obj.joinable()<<endl; </span><br /><br /><span style="font-size: x-small;"> t_obj.join(); </span><br /><br /><span style="font-size: x-small;"> cout<<"After Join, (ACTIVE) joinable=" </span><br /><span style="font-size: x-small;"> <<t_obj.joinable()<<endl; </span><br /><br /><span style="font-size: x-small;"> cout<<"Going out of scope"<<endl; </span><br /><span style="font-size: x-small;"> }</span><span style="color: #2b00fe;"><b>//<--End of scope</b></span><br /><br /><span style="font-size: x-small;"> cout<<"Main Exit"<<endl; </span><br /><br /><span style="font-size: x-small;"> return 0;</span><br /><span style="font-size: x-small;">}</span></span>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Output:</span><span lang="EN-US"> </span></b><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$</span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"> ./join<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going to start thread<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">www.techsujhav.com :<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going out of scope<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">terminate called without an active exception<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Aborted<o:p></o:p></span></p>
</td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$ ./join<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going to start thread<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Before Join, ACTIVE (joinable())=1<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">www.techsujhav.com :<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">After Join, ACTIVE (joinable())=0<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Going out of scope<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Main Exit<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b>Important to note that “Main Exit” is not displayed in output. </b><o:p></o:p></span></p>
</td>
<td style="border-bottom: 1pt solid windowtext; border-left: none; border-right: 1pt solid windowtext; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 261.4pt;" valign="top" width="349">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b>Now it clearly visible that destructor has performed it’s activity
without calling std::terminate.</b><o:p></o:p></span></p>
</td>
</tr>
</tbody></table><span style="font-family: "Courier New";"><br /><br /></span><div><span style="color: red; font-family: courier;"><b><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-what-will-happen-if.html" target="_blank">Question-3: What will happen if we call join again on same thread?</a></b></span><br /><br /><a href="https://www.techsujhav.com/2023/05/stdthreadjoin-advanced.html"><b><span style="font-size: x-large;">PREV:: </span></b><span style="font-size: medium;">std::thread::join [Advanced]</span></a><br /><div style="text-align: center;"><a href="https://www.techsujhav.com/p/threads.html"><span style="font-size: x-large;">Main Page</span></a></div> <div style="text-align: right;"><a href="https://www.techsujhav.com/2023/05/threadjoin-advanced-what-will-happen-if.html"><span style="font-size: medium;">What will happen if we call join again on same thread?</span><span style="font-size: x-large;"><b> ::NEXT</b></span></a></div><p class="MsoNormal" style="text-align: justify;"><b style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: start;">Your Comments /Suggestions & Questions are always welcome. </b></p><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b>We would like to help you with best of our knowledge.</b></div><div style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><b><br />So feel free to put Questions.</b></div><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><br /></span></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><br /></span></p></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-40201074159005038932023-05-31T10:08:00.001+05:302023-07-11T18:47:56.185+05:30std::thread::get_id<p><span style="font-family: "Courier New";">get_id () function return a unique value that is
associated with a give thread called as thread-id. </span></p><p><span style="font-family: "Courier New";"><a href="https://en.cppreference.com/w/cpp/thread/thread/id" style="background: none rgb(255, 255, 255); color: #003080; font-family: DejaVuSansMono, "DejaVu Sans Mono", courier, monospace; font-variant-ligatures: no-common-ligatures; text-decoration-line: none; white-space: nowrap;"><span class="kw2151" style="line-height: 1.1em; margin: 0px; padding: 0px;">std::<span class="me2" style="line-height: 1.1em; margin: 0px; padding: 0px;">thread</span><span class="sy4" style="color: teal; line-height: 1.1em; margin: 0px; padding: 0px;">::</span><span class="me2" style="line-height: 1.1em; margin: 0px; padding: 0px;">id</span></span></a><span style="background-color: white; font-family: DejaVuSansMono, "DejaVu Sans Mono", courier, monospace; font-variant-ligatures: no-common-ligatures; white-space: nowrap;"> is the value returned by </span></span><span style="font-family: "Courier New";">get_id ()function</span></p><p></p><p class="MsoNormal"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Now following program shall help you understand it’s
usage.</span></p><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-border-insideh: .75pt solid windowtext; mso-border-insidev: .75pt solid windowtext; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr>
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-bottom-alt: solid windowtext .75pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697"><span style="font-family: courier;">#include <iostream><br />#include<thread> <span style="color: #2b00fe;"><b>//Thread Header</b></span><br />using namespace std;<br /><br /><span style="color: #2b00fe;"><b>//displayAcitviy- is the actual function that is being<br />//called by the thread.</b></span><br />void displayAcitviy()<br />{<br />cout<<__func__<<"::"<<__LINE__<<" -->t1-Thread-ID= "<<std::this_thread::get_id();<br />cout<<" www.techsujhav.com "<<endl;<br />}<br /><br />int main()<br />{<br />cout<<__func__<<"::"<<__LINE__<<" -->MAIN-Thread-ID= "<<std::this_thread::get_id();<br />cout<<" ::Going to create thread "<<endl;<br /><br /><span style="color: #2b00fe;"><b>//Create thread</b></span><br />std::thread t1(displayAcitviy);<br />cout<<__func__<<"::"<<__LINE__<<" -->t1-Thread-ID= "<<t1.get_id()<<endl;<br /><br /><span style="color: #2b00fe;"><b>//join()- wait for thread t1 to complete its activity</b></span><br />t1.join();<br /><br /><span style="color: #2b00fe;"><b>//exit Main</b></span><br />cout<<__func__<<"::"<<__LINE__<<" -->MAIN-Thread-ID::"<<std::this_thread::get_id();<br />cout<<" ::Exit"<<endl;<br /><br />return 0;<br />}<br /><br /></span></td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-bottom-alt: .75pt; mso-border-color-alt: windowtext; mso-border-left-alt: .5pt; mso-border-right-alt: .5pt; mso-border-style-alt: solid; mso-border-top-alt: solid windowtext .75pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Compile:</span></b><span lang="EN-US"> </span><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">g++ threadId.cpp -o
threadId -lpthread<o:p></o:p></span></b></p>
</td>
</tr>
<tr>
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .75pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Output:<br />
</span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">main::15 -->MAIN-Thread-ID= 139984822441792 ::Going to create
thread<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">main::19 -->t1-Thread-ID= 139984804210432<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">displayAcitviy::9 -->t1-Thread-ID= 139984804210432
www.techsujhav.com<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">main::24 -->MAIN-Thread-ID::139984822441792 ::Exit<b><o:p></o:p></b></span></p>
</td>
</tr>
</tbody></table><p class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"><span lang="EN-US" style="font-family: "Courier New";"><span style="font-size: x-small;"><br /></span></span></p><span style="font-family: courier;"><b><span style="color: red; font-size: large;">How to check and match std::thread::id with thread-id shown in gdb (debugger). </span><span style="color: #2b00fe; font-size: large;">[Click Here]</span></b></span><div><span style="color: #2b00fe; font-family: courier; font-size: medium;"><b><br /></b></span></div><div><span style="color: #2b00fe; font-family: courier; font-size: medium;"><b><br /></b></span></div><div><span style="color: #2b00fe; font-family: times;"><a href="https://www.techsujhav.com/2023/05/stdthreadjoinable.html"><b><span style="font-size: x-large;">PREV:: </span></b><span style="font-size: medium;">std::thread::joinable()</span></a></span></div><div><div style="text-align: center;"><span style="color: #2b00fe; font-weight: 700;"><span style="font-family: times; font-size: x-large;"><a href="https://www.techsujhav.com/p/threads.html">Main Page</a></span></span></div><div style="text-align: right;"><span style="color: #2b00fe;"><span style="font-family: times;"><a href="https://www.techsujhav.com/2023/05/stdthreadjoin.html"><span style="font-size: medium;">std::thread::join()</span><b> <span style="font-size: x-large;">::NEXT</span></b></a></span></span></div><br /><b>Your Comments /Suggestions & Questions are always welcome. </b><div><b>We would like to help you with best of our knowledge. <br />So feel free to put Questions.</b><p></p>
</div></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-85863980916963372892023-05-29T14:18:00.005+05:302023-08-02T12:07:00.318+05:30std::thread::joinable()<p style="text-align: justify;"><span style="font-family: "Courier New";"><b>joinable()</b> function help us to know whether <b>thread
object</b> has a <b><span style="color: red; font-size: medium;">ACTIVE</span></b> thread or not. Thread remain ACTIVE although it has
finished its execution.</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b>Term <span style="font-size: medium;">ACTIVE</span> can be more appropriate to explain as</b></span></p><p class="MsoNormal" style="text-align: justify;"></p><ul><li><span style="font-family: "Courier New"; text-indent: -18pt;">Thread Object is/was assigned with a task by calling
constructor.</span></li><li><span style="font-family: "Courier New"; text-indent: -18pt;">Operations join() or detach() are not called on that
thread object.</span></li></ul><p></p>
<p class="MsoNormal" style="text-align: justify;"><span style="font-family: "Courier New";">Thread created with default constructor is in non
ACTIVE.</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">joinable() returns <b style="mso-bidi-font-weight: normal;">true</b> if thread is active else <b style="mso-bidi-font-weight: normal;">false</b>.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Let’s try to understand with the following examples that is easy to understand. <o:p></o:p></span></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">For better understanding you can <b>copy and paste</b> it in online compiler.</span></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"></span></p><table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody><tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;">
<td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<div style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;">#include<iostream><br /></span><span lang="EN-US" style="font-family: "Courier New";"><span style="font-size: 8pt;">#include<thread> </span><b><span style="color: #2b00fe;">//Thread
Header</span></b><br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><o:p> <br /></o:p></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;">using namespace std;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><o:p> <br /></o:p></span><span style="color: #2b00fe; font-family: courier;"><b><span lang="EN-US">//Following function is the actual task <br /></span><span lang="EN-US">//</span><span style="text-align: justify;">to be performed </span><span style="text-align: justify;">by our thread</span></b></span></div><div style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;">void displayActivity()<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;">{<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;"><span style="mso-spacerun: yes;">
</span>cout<<"www.techsujhav.com "<<endl;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;">}<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;">int main()<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;">{<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;">
cout<<"Going to start thread"<<endl;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><o:p> <br /></o:p></span><span lang="EN-US" style="font-family: "Courier New";"><span style="color: #2b00fe;"><b> //thread object is created with default constructor<br /></b></span></span><span lang="EN-US" style="font-family: "Courier New";"><span style="color: #2b00fe;"><b> //hence joinable output::ACTIVE state is false (0)</b></span><br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;">
</span>std::thread t_obj;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;">
</span>cout<<"Thread before task assigned, (ACTIVE) joinable=
"<<t_obj.joinable()<<endl;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><o:p> <br /></o:p></span><span style="font-family: courier;"><span lang="EN-US"><b><span style="color: #2b00fe;"> //assigned a task with the help of parameterized constructor<br /></span></b></span><span lang="EN-US"><b><span style="color: #2b00fe;"> //</span></b></span><b style="color: #2b00fe; text-align: justify;">hence joinable output::ACTIVE state is true (1)</b></span></div><div style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;">
</span>t_obj=std::thread(displayActivity);<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;">
</span>cout<<"Thread after task assigned, (ACTIVE) joinable=
"<<t_obj.joinable()<<endl;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><o:p> <br /></o:p></span><span lang="EN-US"><span style="font-family: courier;"><span style="color: #0070c0; font-size: 8pt;"> </span><b><span style="color: #2b00fe;">//join operation is called on thread object.</span></b></span></span></div><div style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US"><span style="font-family: courier;"><span style="color: #2b00fe;"><b><span> </span></b></span><b style="color: #2b00fe;"> //hence joinable output::ACTIVE state is false (0)</b></span><span style="color: #2b00fe; font-family: "Courier New";"><b><br /></b></span></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;"> </span>t_obj.join();<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;">
</span>cout<<"Thread after join() operation, (ACTIVE) joinable=
"<<t_obj.joinable()<<endl;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><o:p> <br /></o:p></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><o:p> <br /></o:p></span><span lang="EN-US"><span style="font-family: courier;"><span style="color: #0070c0; font-size: 8pt;"> </span><span style="color: #2b00fe;"><b>//Re-</b><b>Assigning</b><b> a NEW task to existing thread.</b></span></span></span></div><div style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US"><span style="font-family: courier;"><span style="color: #2b00fe;"><b> </b></span><span lang="EN-US"><b><span style="color: #2b00fe;">//</span></b></span><b style="color: #2b00fe; text-align: justify;">hence joinable output::ACTIVE state is true (1)</b></span><span style="color: #2b00fe; font-family: "Courier New";"><b><br /></b></span></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;">
</span>t_obj=std::thread(displayActivity);<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;">
</span>cout<<"Thread after new/re-assigned task, (ACTIVE)
joinable= "<<t_obj.joinable()<<endl;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><o:p> <br /></o:p></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;"><o:p> <br /></o:p></span><span lang="EN-US"><span style="color: #0070c0; font-size: 8pt;"> <span style="font-family: courier;"> </span></span><b><span style="color: #2b00fe; font-family: courier;">//detach operation is called on thread object.</span></b></span></div><div style="line-height: normal; margin-bottom: 0cm;"><span lang="EN-US"><span style="font-family: courier;"><span style="color: #2b00fe;"><b><span> </span><span> </span></b></span><b style="color: #2b00fe;">//hence joinable output::ACTIVE state is false (0)</b></span><span style="color: #2b00fe; font-family: "Courier New";"><b><br /></b></span></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;">
t_obj.detach();<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;"><span style="mso-spacerun: yes;">
</span>cout<<"Thread after detach() operation, (ACTIVE) joinable=
"<<t_obj.joinable()<<endl;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;"><span style="mso-spacerun: yes;"> <br /> </span></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;"><span style="mso-spacerun: yes;">
</span>cout<<"Main Exit"<<endl;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt;"><span style="mso-spacerun: yes;"> </span>return
0;<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 8pt; mso-ansi-language: EN-US;">}<br /></span><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;">
</span></span></div>
</td>
</tr>
<tr style="mso-yfti-irow: 1;">
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<div style="line-height: normal; margin-bottom: 0cm;"><b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Compile:</span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$ </span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">g++ joinable.cpp<span style="mso-spacerun: yes;"> </span>-o joinable
-lpthread</span></div>
</td>
</tr>
<tr style="mso-yfti-irow: 2; mso-yfti-lastrow: yes;">
<td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 522.8pt;" valign="top" width="697">
<div style="line-height: normal; margin-bottom: 0cm;"><b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">Output:</span></b><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;">$ </span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">./joinable<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;"><br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">
Going to start thread<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">Thread before task assigned, (ACTIVE) joinable= 0<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">Thread after task assigned, (ACTIVE) joinable= 1<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">www.techsujhav.com<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">Thread after join() operation, (ACTIVE) joinable= 0<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">Thread after new/re-assigned task, (ACTIVE)
joinable= 1<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">Thread after detach() operation, (ACTIVE) joinable=
0<br /></span><span lang="EN-US" style="font-family: "Courier New"; font-size: 9pt; mso-ansi-language: EN-US;">Main Exit</span></div>
</td>
</tr>
</tbody></table><span lang="EN-US" style="mso-ansi-language: EN-US;"><br /><span style="font-family: times;"><br /><span style="color: #2b00fe;"><a href="https://www.techsujhav.com/2023/06/stdthread.html"><b><span style="font-size: x-large;">PREV:: </span></b><span style="font-size: medium;">std::thread (First Program)</span></a></span></span></span><div><div style="text-align: center;"><span style="color: #2b00fe; font-family: times; font-size: x-large;"><a href="https://www.techsujhav.com/p/threads.html">Main Page</a></span></div><div style="text-align: right;"><span style="color: #2b00fe; font-family: times;"><a href="https://www.techsujhav.com/2023/05/stdthreadgetid.html"><span style="font-size: medium;">std::thread::get_id() </span><b><span style="font-size: x-large;">::NEXT</span></b></a></span></div><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><br /><br /></span><p></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b style="background-color: white; color: yellow; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><span style="color: black;"><span style="font-size: x-small;">Your Comments /Suggestions & Questions are always welcome. </span></span></b></span></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b style="background-color: white; color: yellow; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><span style="color: black;"><span style="font-size: x-small;">We would like to help you with best of our knowledge. </span></span></b></span></p><p class="MsoNormal" style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; mso-ansi-language: EN-US;"><b style="background-color: white; color: yellow; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;"><span style="color: black;"><span style="font-size: x-small;"><b style="color: yellow; font-size: 13.2px;"><span style="color: black;"><span style="font-size: x-small;">So feel free to put Questions.</span></span></b></span></span></b></span></p></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0tag:blogger.com,1999:blog-3141648627189840539.post-80173926259420684922023-05-28T21:29:00.007+05:302023-07-11T18:48:40.722+05:30Types of threads in Operating System<p class="MsoNormal"><span style="font-family: "Courier New"; font-size: medium;">There are two types of threads in a system</span></p><p class="MsoNormal"></p><ol style="text-align: left;"><li><span lang="EN-US" style="font-family: "Courier New"; font-size: medium;">Kernel
Level Threads</span></li><li><span lang="EN-US" style="font-family: "Courier New"; font-size: medium;">User Level Threads</span></li></ol><p></p><p class="MsoNormal"></p><ol style="text-align: left;"><li style="text-align: justify;"><span style="font-size: medium;"><span lang="EN-US" style="font-family: "Courier New"; text-indent: -18pt;"><span style="font-family: "Times New Roman"; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"><b> </b></span></span><span lang="EN-US" style="font-family: "Courier New"; text-indent: -18pt;"><b>User Level
Thread: </b>This is user-application created task/thread that is implemented by
libraries such as posix, java thread etc. These library internally uses the
interface published by OS to create manage threads.</span></span></li><li style="text-align: justify;"><span lang="EN-US" style="font-family: "Courier New"; font-size: medium; text-indent: -18pt;"><b>Kernel
Level Thread: </b>The actual entity that is being scheduled by CPU to perform a
given task. It is closely associated with Hardware. Operating system has total
control over it. It is the OS that create, manages and destroy kernel level
thread as per the requirement received on interface published by OS for user
[i.e. user application]</span></li></ol><p></p><p><span style="color: red;"><span style="font-family: "Courier New"; font-size: large;">Note: </span><b style="font-family: "Courier New";"><span style="font-size: large;">A User
Level thread must be associated with Kernel Level Thread.</span></b></span></p><p><span style="font-family: "Courier New"; font-size: medium;">There are 3 types of mapping/association exist between
User Level Thread and Kernel Level Thread</span></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCOZiRX_cg1AISgV1yUAabfScg_n3t4R1K-Eu0WfggQY0cl94sDZ0aVtmCviKG3nSg_uwttPp1WyvmG3lKO1nu5H4VnKuRiHjVIs4oB3C5oxqEZB_6A6TXuVG7_JGNfq1N8dFOgR3f_9FtF5AK19WYDEjkbVFIUbylTbEkyJVPIxzGVfhZvpT3HpmP/s1200/Type%20of%20thread.gif" style="margin-left: auto; margin-right: auto;"><img alt="User Level Thread and Kernel Level Thread Mapping and Working" border="0" data-original-height="675" data-original-width="1200" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCOZiRX_cg1AISgV1yUAabfScg_n3t4R1K-Eu0WfggQY0cl94sDZ0aVtmCviKG3nSg_uwttPp1WyvmG3lKO1nu5H4VnKuRiHjVIs4oB3C5oxqEZB_6A6TXuVG7_JGNfq1N8dFOgR3f_9FtF5AK19WYDEjkbVFIUbylTbEkyJVPIxzGVfhZvpT3HpmP/w640-h360/Type%20of%20thread.gif" title="User Level Thread and Kernel Level Thread Mapping and Working" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">User Level Thread and Kernel Level Thread Mapping and Working.</td></tr></tbody></table><br /><span style="font-family: "Courier New";"><br /></span><p></p><p><span style="background-color: white; text-align: justify;"><span><span style="color: red; font-family: courier; font-size: large;"><b>M:1</b></span></span></span></p><p><span style="background-color: white; text-align: justify;"><span><span style="color: #444444; font-family: courier;">Multiple User Level Threads are associated with single Kernel Level Thread. This is generally happen single threaded system. Green thread a Solaris 2 library uses it.</span></span></span></p><p><span style="background-color: white; text-align: justify;"><span><span style="color: #444444; font-family: courier;"><b>Advantages</b></span></span></span></p><p></p><ul style="text-align: left;"><li><span style="background-color: white; text-align: justify;"><span><span style="color: #444444; font-family: courier;">Simple to implement</span></span></span></li></ul><p></p><p><span style="background-color: white; text-align: justify;"><span><span style="color: #444444; font-family: courier;"><b>Dis-advantages</b></span></span></span></p><p></p><ul style="text-align: left;"><li><span style="background-color: white; text-align: justify;"><span><span style="color: #444444; font-family: courier;">If one thread makes blocking system-call then all other threads are blocked, complete system on halt until blocking system-call is completed<b>.</b></span></span></span></li></ul><p></p><p><b style="color: red; font-family: courier; font-size: x-large;">1:1</b></p><p style="text-align: justify;"><span style="font-family: courier;">A User level thread is directly associated with a kernel level thread. In addition, remain associated until task is completed. Windows NT, Windows 2000 implements this one-to-one model.</span></p><p><span style="font-family: courier;"><b>Advantages</b></span></p><p></p><ul style="text-align: left;"><li><span style="font-family: courier;">Better than one-to-many model</span></li></ul><p></p><p><span style="font-family: courier;"><b>Dis-advantages</b></span></p><p></p><ul style="text-align: left;"><li><span style="font-family: courier;">There are finite number of kernel threads available on a given system so user shall not be able to create more user-level thread than that finite number.</span></li></ul><p></p><p><b style="color: red; font-family: courier; font-size: x-large;">M:N</b></p><p><span style="background-color: white; text-align: justify;"><span><span style="font-family: courier;">M number of User Level threads are associated with a pool of Kernel Level Threads. UNIX uses this kind of association.</span></span></span></p><p><span style="background-color: white; text-align: justify;"><span><span style="font-family: courier;"><b>Advantages</b></span></span></span></p><p></p><ul style="text-align: left;"><li><span style="background-color: white; text-align: justify;"><span><span style="font-family: courier;">Better than one-to-one</span></span></span></li><li><span style="background-color: white; text-align: justify;"><span><span style="font-family: courier;">There is theoretically no restrictions on number of user-level threads created.</span></span></span></li></ul><div style="text-align: justify;"><span style="font-family: courier;"><br /></span></div><div style="text-align: justify;"><span style="font-family: courier;"><br /></span></div><div style="text-align: justify;"><span style="font-family: times;"><a href="https://www.techsujhav.com/2023/05/chapter-2-process-and-thread-in.html"><b><span style="font-size: x-large;">PREV::</span></b><span style="font-size: medium;">Process and Threads in OS</span></a></span></div><div style="text-align: center;"><span style="font-family: times;"><span><span style="font-size: medium;"> <a href="https://www.techsujhav.com/p/threads.html"> </a></span><span style="font-size: x-large;"><a href="https://www.techsujhav.com/p/threads.html">MAIN PAGE</a></span></span></span></div><div style="text-align: right;"><span style="color: #2b00fe; font-family: times;"><a href="https://www.techsujhav.com/2023/06/stdthread.html"><span style="font-size: medium;">std::thread (First Program) </span><b><span style="font-size: x-large;">:: NEXT</span></b></a></span></div><p></p><div style="text-align: left;"><b style="background-color: white; color: yellow; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: justify;"><span style="color: black;"><span style="font-size: x-small;">Your Comments /Suggestions & Questions are always welcome. </span></span></b></div><div style="text-align: left;"><b style="background-color: white; color: yellow; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: justify;"><span style="color: black;"><span style="font-size: x-small;">We would like to help you with best of our knowledge. <br /></span></span></b><b style="background-color: white; color: yellow; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; text-align: justify;"><span style="color: black;"><span style="font-size: x-small;">So feel free to put Questions.</span></span></b></div>vinay parasharhttp://www.blogger.com/profile/02452278815847501045noreply@blogger.com0