当前位置:   article > 正文

使用pthread_create()创建线程

编写一个程序,使用pthread创建一个新线程,在主线成和新线程中分别显示进程id

可以通过 pthread_create()函数创建新线程。

  1. #include <pthread.h>
  2. int pthread_create(pthread_t *restrict tidp,
  3. const pthread_attr_t *restrict attr,
  4. void *(*start_rtn)(void *),
  5. void *restrict arg);

返回值:
若成功,返回0;否则,返回错误编码

参数说明:

  • tidp:新创建的线程ID会被设置成tidp指向的内存单元。
  • attr:用于定制各种不能的线程属性,默认为NULL
  • start_rtn:新创建的线程从start_rtn函数的地址开始运行,该函数只有一个void类型的指针参数即arg,如果start_rtn需要多个参数,可以将参数放入一个结构中,然后将结构的地址作为arg传入。

pthread函数在调用失败后通常会返回错误码,但不会设置errno

我们看下面一个例子,该示例中,程序创建了一个线程,打印了进程ID、新线程的线程ID以及初始线程的线程ID。

  1. #include <pthread.h>
  2. pthread_t ntid;
  3. void printids(const char *s)
  4. {
  5. pid_t pid;
  6. pthread_t tid;
  7. pid = getpid();
  8. tid = pthread_self();
  9. printf("%s pid %lu tid %lu (0x%lx)\n", s, (unsigned long)pid, (unsigned long)tid, (unsigned long)tid);
  10. }
  11. void* thr_fn(void *arg)
  12. {
  13. printids("new thread:");
  14. return((void*)0);
  15. }
  16. int main()
  17. {
  18. int err;
  19. err = pthread_create(&ntid, NULL, thr_fn, NULL);
  20. if(err!=0)
  21. {
  22. printf("can't create thread\n");
  23. exit(1);
  24. }
  25. printids("main thread:");
  26. sleep(2);
  27. exit(0);
  28. }

运行结果如下:

  1. main thread: pid 13019 tid 139937898653440 (0x7f45d4bd6700)
  2. new thread: pid 13019 tid 139937890158336 (0x7f45d43bc700)

正如我们的期望,进程ID相同10310,线程ID不同。

主线程如果不休眠,有可能在新线程执行之前就退出了。

如下是去掉后的再次执行结果,很明显,第一次执行时,新线程没有机会运行:

  1. ➜ tmp ./pt
  2. main thread: pid 13113 tid 139742167656192 (0x7f1842436700)
  3. ➜ tmp ./pt
  4. main thread: pid 13119 tid 139768977393408 (0x7f1e803f8700)
  5. new thread: pid new thread: pid 13119 tid 139768968922880 (0x7f1e7fbe4700)

上面示例中,我们使用pthread_self()函数获得线程的ID

转载于:https://www.cnblogs.com/biggerman/p/6940888.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/181944
推荐阅读
相关标签
  

闽ICP备14008679号