第十一章:线程

论坛 期权论坛     
选择匿名的用户   2021-5-22 14:50   121   0
<div class="blogpost-body" id="cnblogs_post_body">
<h2>11.1:引言</h2>
<p>本章介绍多线程的使用</p>
<h2>11.2:线程概念</h2>
<p>典型的Unix进程可以看作只有一个控制线程:一个进程在同一时刻只做一件事情。</p>
<h2>11.3:线程标识</h2>
<p>每个线程跟进程一样,都有一个线程ID来标识。</p>
<div class="cnblogs_code">
  <pre class="blockcode">#include &lt;pthread.h&gt;
<span style="color:#0000ff;">int</span> pthread_equal(pthread_t tid1, pthread_t tid2); <span style="color:#008000;">//</span><span style="color:#008000;"> 判断两个线程ID是否相等,若相等,返回非0,否则返回0</span>
pthread_t pthread_self(<span style="color:#0000ff;">void</span>); <span style="color:#008000;">//</span><span style="color:#008000;"> 返回调用线程的线程ID</span></pre>
</div>
<h2>11.4:线程创建</h2>
<p>默认一个进程只包含有个线程,如果要实现多线程,首先得创建新的线程,可以使用函数pthread_create来实现。</p>
<div class="cnblogs_code">
  <pre class="blockcode">#include &lt;pthread.h&gt;
<span style="color:#008000;">//</span><span style="color:#008000;"> 若成功返回0,否则返回错误编号</span>
<span style="color:#0000ff;">int</span> pthread_create(pthread_t *restrict tidp, <span style="color:#0000ff;">const</span> pthread_attr_t *restrict attr, <span style="color:#0000ff;">void</span>*(*start_rtn)(<span style="color:#0000ff;">void</span>), <span style="color:#0000ff;">void</span> *restrict arg);</pre>
</div>
<p>如果成功,tidp指向的内存保存线程ID,attr是线程属性,可以为NULL,start_rtn是线程函数,arg是传递给线程函数的参数。</p>
<p>实例:11.1 测试线程ID</p>
<div class="cnblogs_code">
  <pre class="blockcode">#include &lt;pthread.h&gt;<span style="color:#000000;">

#include </span>&lt;iostream&gt;<span style="color:#000000;">
#include </span>&lt;cstdio&gt;<span style="color:#000000;">
#include </span>&lt;cstdlib&gt;<span style="color:#000000;">
#include </span>&lt;cerrno&gt;
<span style="color:#0000ff;">using</span> <span style="color:#0000ff;">namespace</span><span style="color:#000000;"> std;

pthread_t ntid;
</span><span style="color:#0000ff;">void</span> printids(<span style="color:#0000ff;">const</span> <span style="color:#0000ff;">char</span> *<span style="color:#000000;">s)
{
    pid_t pid;
    pthread_t tid;

    pid </span>&#61;<span style="color:#000000;"> getpid();
    tid </span>&#61;<span style="color:#000000;"> pthread_self();
    printf(</span><span style="color:#800000;">&#34;</span><span style="color:#800000;">%s pid %u tid %u (0x%x)\n</span><span style="color:#800000;">&#34;</span>, s, (unsigned <span style="color:#0000ff;">int</span>)pid, (unsigned <span style="color:#0000ff;">int</span>)tid, (unsigned <span style="color:#0000ff;">int</span><span style="color:#000000;">)tid);
}

</span><span style="color:#0000ff;">void</span>* thr_fn(<span style="color:#0000ff;">void</span> *<span style="color:#000000;">arg)
{
    printids(</span><span style="color:#800000;">&#34;</span><span style="color:#800000;">new thread: </span><span style="color:#800000;">&#34;</span><span style="color:#000000;">);
    </span><span style="color:#0000ff;">return</span> ((<span style="color:#0000ff;">void</span>*)<span style="color:#800080;">0</span><span style="color:#000000;">);
}

</span><span style="color:#0000ff;">int</span> main(<span style="color:#0000ff;">int</span> argc, <span style="color:#0000ff;">char</span> **<span style="color:#000000;">argv)
{
    </span><span style="color:#0000ff;">int</span><span style="color:#000000;"> err;
    err </span>&#61; pthread_create(&amp;<span style="color:#000000;">ntid, NULL, thr_fn, NULL);
    </span><span style="color:#0000ff;">if</span> (err !&#61; <span style="color:#800080;">0</span><span style="color:#000000;">)
    {
        perror(</span><span style="color:#800000;">&#34;</span><span style="color:#800000;">create thread failed!</span><span style="color:#800000;">&#34;</span><span style="color:#000000;">);
        </span><span style="color:#0000ff;">return</span> <span style="color:#800080;">0</span><span style="color:#000000;">;
    }
    printids(</span><span style="color:#800000;">&#34;</span><span style="color:#800000;">main thread:</span><span style="color:#800000;">&#34;</span><span style="color:#000000;">);
    sleep(</span><span style="color:#800080;">100</span><span style="color:#000000;">);
    exit(</span><span style="color:#800080;">0</span><span style="color:#000000;">);
}</span></pre>
</div>
<h2>11.5:线程终止</h2>
<p>如果进程中任一线程调用了exit、_exit、_Exit,那么整个进程就会终止。与此类似,如果信号的默认动作是终止进程,那么信号发送到线程会终止整个进程。</p>
<p>单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流:</p>
<p>1.线程只是从启动例程中返回,返回值是线程的退出码。</p>
<p>2.线程可以被同一个进程中的其他线程取消。</p>
<p>3.线程调用pthread_exit()。</p>
<div class="cnblogs_code">
  <pre class="blockcode">#include &lt;pthread.h&gt;
<span style="color:#0000ff;">void</sp
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP