Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #120748

Re: thread_local question...

From wij <wyniijj5@gmail.com>
Newsgroups comp.lang.c++
Subject Re: thread_local question...
Date 2024-10-21 19:20 +0800
Organization A noiseless patient Spider
Message-ID <4ba69cbf99403319abd6209d4423dabfebec0600.camel@gmail.com> (permalink)
References (1 earlier) <ve8f6l$34vt2$1@dont-email.me> <ve98fe$392tv$2@dont-email.me> <9dc17426ed663b192a4e1467b8fc488e6be377bd.camel@gmail.com> <vf4db2$l6cb$6@dont-email.me> <324eb5eb8a81aa1109d9ff6cf05c29886569e368.camel@gmail.com>

Show all headers | View raw


On Mon, 2024-10-21 at 19:06 +0800, wij wrote:
> On Sun, 2024-10-20 at 19:12 -0700, Chris M. Thomasson wrote:
> > On 10/10/2024 12:20 PM, wij wrote:
> > [...]
> > 
> > Check this shit out:
> > 
> > Here is my crude code:
> > _______________________________________
> > #include <iostream>
> > #include <functional>
> > #include <thread>
> > #include <atomic>
> > #include <mutex>
> > 
> > 
> > #define CT_THREADS 5
> > 
> > 
> > struct ct_shared
> > {
> >      std::mutex m_cout_lock;
> > };
> > 
> > 
> > struct ct_per_thread
> > {
> >      ct_shared& m_shared;
> >      unsigned long m_id;
> > 
> >      ct_per_thread(
> >          ct_shared& shared,
> >          unsigned long id
> > 
> >      ):  m_shared(shared),
> >          m_id(id)
> >      {
> >          {
> >              std::unique_lock<std::mutex> lock(m_shared.m_cout_lock);
> >              std::cout << "ct_per_thread::ct_per_thread(" << m_id << ")" 
> > << std::endl;
> >          }
> >      }
> > 
> >      ~ct_per_thread()
> >      {
> >          {
> >              std::unique_lock<std::mutex> lock(m_shared.m_cout_lock);
> >              std::cout << "ct_per_thread::~ct_per_thread(" << m_id << 
> > ")" << std::endl;
> >          }
> >      }
> > };
> > 
> > 
> > 
> > thread_local ct_per_thread* g_per_thread = nullptr;
> > 
> > 
> > 
> > void
> > ct_foo()
> > {
> >      // Okay, what about this shit!
> >      {
> >          std::unique_lock<std::mutex> 
> > lock(g_per_thread->m_shared.m_cout_lock);
> >          std::cout << "ct_foo(" << g_per_thread->m_id << ")" << std::endl;
> >      }
> > }
> > 
> > 
> > void
> > ct_thread(
> >      ct_shared& shared,
> >      unsigned long id
> > ) {
> >      {
> >          thread_local ct_per_thread self(shared, id);
> > 
> >          g_per_thread = &self;
> >      }
> > 
> >      ct_foo();
> > }
> > 
> > 
> > int
> > main()
> > {
> >      std::cout << "ct_plot_pre_alpha... Testing 123! :^)\n\n";
> >      std::cout << "_____________________________________________" << 
> > std::endl;
> > 
> >      {
> >          ct_shared shared;
> > 
> >          {
> >              std::thread threads[CT_THREADS];
> > 
> >              std::cout << "launching " << CT_THREADS << " threads..." << 
> > std::endl;
> > 
> >              for (unsigned long i = 0; i < CT_THREADS; ++i)
> >              {
> >                  threads[i] = std::thread(ct_thread, std::ref(shared), i);
> >              }
> > 
> >              for (unsigned long i = 0; i < CT_THREADS; ++i)
> >              {
> >                  threads[i].join();
> >              }
> >          }
> >      }
> > 
> >      std::cout << "_____________________________________________\n";
> >      std::cout << "complete!\n";
> > 
> >      return 0;
> > }
> > _______________________________________
> 
> Don't know what the program is demonstrating.
> The following is what I thought what ct_thread is doing.
> 
> 1. In libwy, each thread is represented by a PThread object, following the RAII
>    principle. (your program looked to me std::thread API has no idea of RAII).
> 2. libwy only has Mutex (wrapper of pthread_mutex), because other kinds of 
>    mutexes are considered not often used and easily implemented (except futex)
>    and many application variations, i.e. read/write mutex.
> 3. Wy::PThread has no public facilities for 'thread specific' (thread local), 
>    because in most cases, 'thread local' can be implemented as class data 
>    member. 
>    (Wy::PThread is old from the time the underlying Linux Thread is buggy,
>     and I am tired to revise it without real cases showing the necessarity.)
> 
> // t.cpp
> #include <Wy.pthread.h>
> #include <Wy.stdio.h>
>     
> using namespace Wy;
> 
> class Thread : public PThread {
>     Mutex *m_gmtx;  // for 'thread common' data
>     int   m_id;
> 
>     // Many 'thread local' data can be put here.
>   public:
>     Thread(Mutex& mtx, int id) : m_gmtx(&mtx), m_id(id) {};
>     Errno begin() override { return PThread::begin(); };
>     ~Thread() {
>        NoCancel noc;
>        tmain_close(); // Stop possibly active thread, then destruction begins.
>        cout << "~Thread(mtx," << m_id << ")" WY_ENDL;
>     };
> 
>   protected:
>     Errno tmain() override {
>       Mutex::Lock aa(*m_gmtx);
>       cout << "Thread(mtx," << m_id << ")" WY_ENDL;
>       return Ok;
>     };
> };
> 
> #define CT_THREADS 5
> 
> int main()
> try {        
>   Errno r;
>   Mutex shared_mutex;
>   Thread thrd[CT_THREADS]={
>                    Thread(shared_mutex,0),
>                    Thread(shared_mutex,1), 
>                    Thread(shared_mutex,2),
>                    Thread(shared_mutex,3),
>                    Thread(shared_mutex,4),
>                  };
> 
>  for(int i=0; i<CT_THREADS; ++i) {
>    if((r=thrd[i].begin())!=Ok) {
>      WY_THROW(r);
>    }
>  }
> 
>  for(int i=0; i<CT_THREADS; ++i) {
>    if((r=thrd[i].wait_if(PThread::Running))!=Ok) {
>      WY_THROW(r);
>    }
>  }
> 
>  return 0;
> }
> catch(const Errno& e) {
>   cerr << wrd(e) << WY_ENDL;
>   throw;
> }
> catch(...) {
>   cerr << "Unknown thrown object" WY_ENDL;
>   throw;
> };
> 
> -----------------------------
> []$ g++ t.cpp -lwy
> []$ ./a.out 
> Thread(mtx,0)
> Thread(mtx,1)
> Thread(mtx,4)
> Thread(mtx,2)
> Thread(mtx,3)
> ~Thread(mtx,4)
> ~Thread(mtx,3)
> ~Thread(mtx,2)
> ~Thread(mtx,1)
> ~Thread(mtx,0)




Correction of the critic "your program looked to me std::thread API has no idea of RAII"
from "threads[i] = std::thread(ct_thread, std::ref(shared), i);"
It may just difference of implementation.

Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-09 19:02 -0700
  Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-09 19:08 -0700
  Re: thread_local question... Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-10-09 19:33 -0700
    Re: thread_local question... Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-10-09 19:40 -0700
      Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-09 20:08 -0700
    Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-09 20:19 -0700
  Re: thread_local question... jseigh <jseigh_es00@xemaps.com> - 2024-10-10 07:52 -0400
    Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-10 12:04 -0700
      Re: thread_local question... wij <wyniijj5@gmail.com> - 2024-10-11 03:20 +0800
        Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-20 19:12 -0700
          Re: thread_local question... wij <wyniijj5@gmail.com> - 2024-10-21 19:06 +0800
            Re: thread_local question... wij <wyniijj5@gmail.com> - 2024-10-21 19:20 +0800
      Re: thread_local question... jseigh <jseigh_es00@xemaps.com> - 2024-10-10 15:57 -0400
        Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-11 13:36 -0700
      Re: thread_local question... jseigh <jseigh_es00@xemaps.com> - 2024-10-11 09:50 -0400
        Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-11 12:21 -0700
          Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-11 22:53 -0700
            Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-11 22:56 -0700
        Re: thread_local question... jseigh <jseigh_es00@xemaps.com> - 2024-10-11 17:05 -0400
          Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-12 13:44 -0700
            Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-12 13:46 -0700
  Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-12 13:29 -0700
    Re: thread_local question... "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-10-12 13:43 -0700

csiph-web