多线程

 

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>                      /*  多线程头文件  */
#include <unistd.h>
#include <string.h>
 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /* 初始化线程锁、互斥锁, 类型可以改变,如果互斥锁类型为 mutex = PTHREAD_MUTEX_ERRORCHECK,则会提供错误检查,如果互斥锁类型为 mutex = PTHREAD_MUTEX_RECURSIVE,则该互斥锁会保留锁定计数这一概念*/
void printids(const char *s) { pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int) pid, (unsigned int) tid, (unsigned int) tid); } void *thr_fn(void *arg) {
   pthread_mutex_lock(&mutex); /* 添加线程互斥锁 */ printids(
"new thread: ");
   pthread_mutex_unlock(&mutex); /* 线程互斥锁解锁 */
return NULL; } int main(void) { int err; pthread_t ntid;
pthread_mutex_init(&mutex, NULL); /* 互斥锁的初始化 */ err
= pthread_create(&ntid, NULL, thr_fn, NULL); /* 线程的创建
                                                                       第一个参数为指向线程标识符指针

                                           第二个参数用来设置线程属性。

                                           第三个参数是线程运行函数的起始地址。

                                           最后一个参数是运行函数的参数。
                                                         */
    if (err != 0)                                           /*  判断线程是否创建成功  */
   {
   printf(
"can't create thread: %s\n", strerror(err));   }
printids(
"main thread:"); pthread_join(ntid,NULL); /* 线程等待、销毁(主线程等待ntid线程结束) */
pthread_mutex_destroy(&mutex) /* 互斥锁的销毁 */
return EXIT_SUCCESS; }

        当线程正在做其它事情的时候(由于互斥对象当前是锁定的),如果希望锁定互斥对象,这个调用就相当方便。调用pthread_mutex_trylock()时将尝试锁定互斥对象。如果互斥对象当前处于解锁状态,那么您将获得该锁并且函数将返回零。然而,如果互斥对象已锁定,这个调用也不会阻塞。当然,它会返回非零的EBUSY 错误值。然后可以继续做其它事情,稍后再尝试锁定。

 

中止线程可以有三种方式:
  a.     在线程函数中return
  b.     被同一进程中的另外的线程Cancel掉
  c.     线程调用pthread_exit函数
pthread_exit和pthread_join函数的用法:
  a.     线 程A调用pthread_join(B, &rval_ptr),被Block,进入Detached状态(如果已经进入Detached状态,则pthread_join函数返回 EINVAL)。如果对B的结束代码不感兴趣,rval_ptr可以传NULL。
  b.    线程B调用pthread_exit(rval_ptr),退出线程B,结束代码为rval_ptr。注意rval_ptr指向的内存的生命周期,不应该指向B的Stack中的数据。
  c.     线程A恢复运行,pthread_join函数调用结束,线程B的结束代码被保存到rval_ptr参数中去。如果线程B被Cancel,那么rval_ptr的值就是PTHREAD_CANCELLED。
exit(EXIT_FAILURE), _Exit, _exit用于中止当前进程,而非线程。
posted @ 2021-10-13 13:38  丶Future  阅读(26)  评论(0编辑  收藏  举报