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

C语言中的多线程

概念

1.进程

进程的概念

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

进程的特征

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

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

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

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

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

2.线程

线程的概念

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

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

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

使用多线程

pthread_create

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

函数声明
int pthread_create(pthread_t * tidp, const pthread_attr_t * attr,
		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。

示例

输出线程标识符

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>

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)
{
    printids("new thread:");
    return NULL;
}

int main()
{
    int err;
    pthread_t ntid;
    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);
    return 0;
}

Blog

Opinion

Project