首页 关于 微信公众号
欢迎关注我的微信公众号

C语言中的多线程

概念

1.进程

进程的概念

进程是正在运行的程序实例。它是一个具有一定独立功能的程序关于某个数据集合的一次活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

进程的特征

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。

并发性:任何进程都可以同其他进程一起并发执行。

独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;

异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。

特征:进程由程序、数据和进程控制块三部分组成。

2.线程

线程的概念

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并行多个线程。每条线程并行执行不同的任务。

线程是独立调度和分派的基本单位。线程可以操作系统内核调度的内核线程。

C语言在刚开始时,并没有设计多线程机制,由于随着软硬件的发展及需求的发展。后来C语言才开发了线程库以支持多线程的操作应用。

使用多线程

pthread_create

pthread_create是类Unix操作系统(Unix,Linux,Mac OS X等)的创建线程的函数。

函数声明
  1. int pthread_create(pthread_t * tidp, const pthread_attr_t * attr,
  2. void *(*)(start_rtn *), void * arg);
参数

tidp : 指向线程标识符的指针。

attr :用来设置线程属性。

start_rtn: 是线程运行函数的起始地址。

arg:运行函数的参数。

返回值

若创建成功,则返回0;创建失败则返回错误编号。

返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID;attr参数用于指定各种不同的线程属性;新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址arg的参数传入。

linux下用C语言开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。

示例

输出线程标识符

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

Blog

Opinion

Project