⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pasync.h.html

📁 PTypes是一个扩充了多线程和网络功能的STL库
💻 HTML
📖 第 1 页 / 共 2 页
字号:
    <font CLASS=keytype>int</font>     writecnt;<font CLASS=preproc>#else</font>     pthread_mutex_t mtx;    pthread_cond_t readcond;    pthread_cond_t writecond;    <font CLASS=keytype>int</font> locks;    <font CLASS=keytype>int</font> writers;    <font CLASS=keytype>int</font> readers;<font CLASS=preproc>#endif</font> <font CLASS=preproc><font CLASS=keyword>public</font>:</font>    rwlock();    ~rwlock();    <font CLASS=keytype>void</font> rdlock();    <font CLASS=keytype>void</font> wrlock();    <font CLASS=keytype>void</font> unlock();    <font CLASS=keytype>void</font> lock()     { wrlock(); }};<font CLASS=preproc>#elif</font> defined(__POSIX_RWLOCK__) <font CLASS=keyword>struct</font> rwlock: public noncopyable{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>    pthread_rwlock_t rw;<font CLASS=preproc><font CLASS=keyword>public</font>:</font>    rwlock();    ~rwlock()       { pthread_rwlock_destroy(&amp;rw); }    <font CLASS=keytype>void</font> rdlock()   { pthread_rwlock_rdlock(&amp;rw); }    <font CLASS=keytype>void</font> wrlock()   { pthread_rwlock_wrlock(&amp;rw); }    <font CLASS=keytype>void</font> unlock()   { pthread_rwlock_unlock(&amp;rw); }    <font CLASS=keytype>void</font> lock()     { wrlock(); }};<font CLASS=preproc>#endif</font> <font CLASS=preproc>#if</font> defined(__PTYPES_RWLOCK__) <font CLASS=symbols>||</font> defined(__POSIX_RWLOCK__) <font CLASS=comment>//</font><font CLASS=comment>// scoperead &amp; scopewrite</font><font CLASS=comment>//</font><font CLASS=keyword>class</font> scoperead: <font CLASS=keyword>public</font> noncopyable{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>    rwlock* rw;<font CLASS=preproc><font CLASS=keyword>public</font>:</font>    scoperead(rwlock&amp; irw): rw(&amp;irw)  { rw<font CLASS=symbols>-</font>&gt;rdlock(); }    ~scoperead()  { rw<font CLASS=symbols>-</font>&gt;unlock(); }};<font CLASS=keyword>class</font> scopewrite: <font CLASS=keyword>public</font> noncopyable{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>    rwlock* rw;<font CLASS=preproc><font CLASS=keyword>public</font>:</font>    scopewrite(rwlock&amp; irw): rw(&amp;irw)  { rw<font CLASS=symbols>-</font>&gt;wrlock(); }    ~scopewrite()  { rw<font CLASS=symbols>-</font>&gt;unlock(); }};<font CLASS=preproc>#endif</font> <font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=comment>// --- semaphore ------------------------------------------------------ //</font><font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=preproc>#if</font> defined(WIN32) <font CLASS=symbols>||</font> defined(__DARWIN__) <font CLASS=symbols>||</font> defined(__bsdi__) <font CLASS=preproc>#</font>  define __SEM_TO_TIMEDSEM__ <font CLASS=preproc>#endif</font> <font CLASS=preproc>#ifdef</font> __SEM_TO_TIMEDSEM__ <font CLASS=comment>// map ordinary semaphore to timed semaphore</font><font CLASS=keyword>class</font> timedsem;<font CLASS=keyword>typedef</font> timedsem semaphore;<font CLASS=preproc>#else</font> <font CLASS=keyword>class</font> semaphore: public unknown{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>    sem_t handle;<font CLASS=preproc><font CLASS=keyword>public</font>:</font>    semaphore(<font CLASS=keytype>int</font> initvalue);    <font CLASS=keyword>virtual</font> ~semaphore();    <font CLASS=keytype>void</font> wait();    <font CLASS=keytype>void</font> post();    <font CLASS=keytype>void</font> signal()  { post(); }};<font CLASS=preproc>#endif</font> <font CLASS=keyword>class</font> timedsem: public unknown{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font><font CLASS=preproc>#ifdef</font> WIN32     HANDLE handle;<font CLASS=preproc>#else</font>     <font CLASS=keytype>int</font> count;    pthread_mutex_t mtx;    pthread_cond_t cond;<font CLASS=preproc>#endif</font> <font CLASS=preproc><font CLASS=keyword>public</font>:</font>    timedsem(<font CLASS=keytype>int</font> initvalue);    <font CLASS=keyword>virtual</font> ~timedsem();    <font CLASS=keytype>bool</font> wait(<font CLASS=keytype>int</font> msecs <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);    <font CLASS=keytype>void</font> post();    <font CLASS=keytype>void</font> signal()  { post(); }};<font CLASS=preproc>#ifdef</font> PTYPES18_COMPAT     <font CLASS=keyword>typedef</font> timedsem tsemaphore;<font CLASS=preproc>#endif</font> <font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=comment>// --- thread --------------------------------------------------------- //</font><font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=keyword>class</font> thread: public unknown{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font><font CLASS=preproc>#ifdef</font> WIN32     <font CLASS=keytype>unsigned</font> id;<font CLASS=preproc>#endif</font>     pthread_t  handle;    <font CLASS=keytype>int</font>  autofree;    <font CLASS=keytype>int</font>  running;    <font CLASS=keytype>int</font>  signaled;    <font CLASS=keytype>int</font>  finished;    <font CLASS=keytype>int</font>  freed;    <font CLASS=keytype>int</font>  reserved;   <font CLASS=comment>// for priorities</font>    timedsem relaxsem;    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> execute() <font CLASS=symbols>=</font> <font CLASS=integer>0</font>;    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> cleanup();    <font CLASS=keytype>bool</font> relax(<font CLASS=keytype>int</font> msecs) { <font CLASS=keyword>return</font> relaxsem.wait(msecs); }    <font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> _threadepilog(thread* thr);<font CLASS=preproc>#ifdef</font> WIN32     <font CLASS=keyword>friend</font> <font CLASS=keytype>unsigned</font> __stdcall _threadproc(<font CLASS=keytype>void</font>* arg);<font CLASS=preproc>#else</font>     <font CLASS=keyword>friend</font> <font CLASS=keytype>void</font>* _threadproc(<font CLASS=keytype>void</font>* arg);<font CLASS=preproc>#endif</font> <font CLASS=preproc><font CLASS=keyword>public</font>:</font>    thread(<font CLASS=keytype>bool</font> iautofree);    <font CLASS=keyword>virtual</font> ~thread();<font CLASS=preproc>#ifdef</font> WIN32     pthread_id_t get_id()   { <font CLASS=keyword>return</font> <font CLASS=keytype>int</font>(id); }<font CLASS=preproc>#else</font>     pthread_id_t get_id()   { <font CLASS=keyword>return</font> handle; }<font CLASS=preproc>#endif</font>     <font CLASS=keytype>bool</font> get_running()    { <font CLASS=keyword>return</font> running <font CLASS=symbols>!=</font> <font CLASS=integer>0</font>; }    <font CLASS=keytype>bool</font> get_finished()   { <font CLASS=keyword>return</font> finished <font CLASS=symbols>!=</font> <font CLASS=integer>0</font>; }    <font CLASS=keytype>bool</font> get_signaled()   { <font CLASS=keyword>return</font> signaled <font CLASS=symbols>!=</font> <font CLASS=integer>0</font>; }    <font CLASS=keytype>void</font> start();    <font CLASS=keytype>void</font> signal();    <font CLASS=keytype>void</font> waitfor();};<font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=comment>// --- jobqueue &amp; msgqueue -------------------------------------------- //</font><font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=keyword>const</font> <font CLASS=keytype>int</font> MSG_USER <font CLASS=symbols>=</font> <font CLASS=integer>0</font>;<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> MSG_QUIT <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>;<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> DEF_QUEUE_LIMIT <font CLASS=symbols>=</font> <font CLASS=integer>5000</font>;<font CLASS=keyword>class</font> message: public unknown{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>    message* next;          <font CLASS=comment>// next in the message chain, used internally</font>    semaphore* sync;        <font CLASS=comment>// used internally by msgqueue::send(), when called from a different thread</font>    <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> jobqueue;  <font CLASS=comment>// my friends, job queue and message queue...</font>    <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> msgqueue;<font CLASS=preproc><font CLASS=keyword>public</font>:</font>    <font CLASS=keytype>int</font> id;    pintptr param;    pintptr result;    message(<font CLASS=keytype>int</font> iid, pintptr iparam <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);    <font CLASS=keyword>virtual</font> ~message();};<font CLASS=keyword>class</font> jobqueue: public noncopyable{<font CLASS=preproc><font CLASS=keyword>private</font>:</font>    <font CLASS=keytype>int</font>       limit;        <font CLASS=comment>// queue limit</font>    message*  head;         <font CLASS=comment>// queue head</font>    message*  tail;         <font CLASS=comment>// queue tail</font>    <font CLASS=keytype>int</font>       qcount;       <font CLASS=comment>// number of items in the queue</font>    timedsem  sem;          <font CLASS=comment>// queue semaphore</font>    timedsem  ovrsem;       <font CLASS=comment>// overflow semaphore</font>    mutex     qlock;        <font CLASS=comment>// critical sections in enqueue and dequeue</font><font CLASS=preproc><font CLASS=keyword>protected</font>:</font>    <font CLASS=keytype>bool</font> enqueue(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);    <font CLASS=keytype>bool</font> push(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);    message* dequeue(<font CLASS=keytype>bool</font> safe <font CLASS=symbols>=</font> <font CLASS=keyword>true</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>);    <font CLASS=keytype>void</font> purgequeue();<font CLASS=preproc><font CLASS=keyword>public</font>:</font>    jobqueue(<font CLASS=keytype>int</font> ilimit <font CLASS=symbols>=</font> DEF_QUEUE_LIMIT);    <font CLASS=keyword>virtual</font> ~jobqueue();    <font CLASS=keytype>int</font>  get_count() <font CLASS=keyword>const</font>  { <font CLASS=keyword>return</font> qcount; }    <font CLASS=keytype>int</font>  get_limit() <font CLASS=keyword>const</font>  { <font CLASS=keyword>return</font> limit; }    <font CLASS=keytype>bool</font> post(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);    <font CLASS=keytype>bool</font> post(<font CLASS=keytype>int</font> id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>);    <font CLASS=keytype>bool</font> posturgent(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);    <font CLASS=keytype>bool</font> posturgent(<font CLASS=keytype>int</font> id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>);    message* getmessage(<font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);<font CLASS=preproc>#ifdef</font> PTYPES19_COMPAT     <font CLASS=keytype>int</font>  msgsavail() <font CLASS=keyword>const</font>  { <font CLASS=keyword>return</font> get_count(); }<font CLASS=preproc>#endif</font> };<font CLASS=keyword>template</font> &lt;<font CLASS=keyword>class</font> T&gt; <font CLASS=keyword>class</font> tjobqueue: <font CLASS=keyword>protected</font> jobqueue{<font CLASS=preproc><font CLASS=keyword>public</font>:</font>    tjobqueue(<font CLASS=keytype>int</font> ilimit <font CLASS=symbols>=</font> DEF_QUEUE_LIMIT);    <font CLASS=keytype>int</font>  get_count() <font CLASS=keyword>const</font>                      { <font CLASS=keyword>return</font> jobqueue::get_count(); }    <font CLASS=keytype>int</font>  get_limit() <font CLASS=keyword>const</font>                      { <font CLASS=keyword>return</font> jobqueue::get_limit(); }    <font CLASS=keytype>bool</font> post(T* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>)         { <font CLASS=keyword>return</font> jobqueue::post(msg, timeout); }    <font CLASS=keytype>bool</font> posturgent(T* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>)   { <font CLASS=keyword>return</font> jobqueue::posturgent(msg, timeout); }    T*   getmessage(<font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>)           { <font CLASS=keyword>return</font> (T*)jobqueue::getmessage(timeout); }};<font CLASS=keyword>class</font> msgqueue: <font CLASS=keyword>protected</font> jobqueue{<font CLASS=preproc><font CLASS=keyword>private</font>:</font>    mutex thrlock;          <font CLASS=comment>// lock for the queue processing</font>    pthread_id_t owner;     <font CLASS=comment>// thread ID of the queue processing thread</font>    pintptr finishmsg(message* msg);    <font CLASS=keytype>void</font> handlemsg(message* msg);    <font CLASS=keytype>void</font> takeownership();<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>    <font CLASS=keytype>bool</font> quit;    <font CLASS=keytype>void</font> defhandler(message&amp; msg);    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> msghandler(message&amp; msg) <font CLASS=symbols>=</font> <font CLASS=integer>0</font>;<font CLASS=preproc><font CLASS=keyword>public</font>:</font>    msgqueue(<font CLASS=keytype>int</font> ilimit <font CLASS=symbols>=</font> DEF_QUEUE_LIMIT);    <font CLASS=keyword>virtual</font> ~msgqueue();    // functions calling from the owner<font CLASS=preproc> thread:</font>    <font CLASS=keytype>void</font> processone();  <font CLASS=comment>// process one message, may hang if no msgs in the queue</font>    <font CLASS=keytype>void</font> processmsgs(); <font CLASS=comment>// process all available messages and return</font>    <font CLASS=keytype>void</font> run();         <font CLASS=comment>// process messages until MSG_QUIT</font>    // functions calling from any<font CLASS=preproc> thread:</font>    <font CLASS=keytype>int</font>  get_count() <font CLASS=keyword>const</font>                                        { <font CLASS=keyword>return</font> jobqueue::get_count(); }    <font CLASS=keytype>int</font>  get_limit() <font CLASS=keyword>const</font>                                        { <font CLASS=keyword>return</font> jobqueue::get_limit(); }    <font CLASS=keytype>bool</font> post(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>)                     { <font CLASS=keyword>return</font> jobqueue::post(msg, timeout); }    <font CLASS=keytype>bool</font> post(<font CLASS=keytype>int</font> id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>)        { <font CLASS=keyword>return</font> jobqueue::post(id, param, timeout); }    <font CLASS=keytype>bool</font> posturgent(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>)               { <font CLASS=keyword>return</font> jobqueue::posturgent(msg, timeout); }    <font CLASS=keytype>bool</font> posturgent(<font CLASS=keytype>int</font> id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>)  { <font CLASS=keyword>return</font> jobqueue::posturgent(id, param, timeout); }    pintptr send(message* msg);    pintptr send(int id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);<font CLASS=preproc>#ifdef</font> PTYPES19_COMPAT     <font CLASS=keytype>int</font>  msgsavail() <font CLASS=keyword>const</font>  { <font CLASS=keyword>return</font> get_count(); }<font CLASS=preproc>#endif</font> };<font CLASS=preproc>#ifdef</font> _MSC_VER <font CLASS=preproc>#pragma</font> pack(pop) <font CLASS=preproc>#endif</font> PTYPES_END<font CLASS=preproc>#endif</font> <font CLASS=comment>// __PASYNC_H__ </font></pre></div><hr noshade></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -