概念
所有这些线程在同一个进程中执行同一个程序,但是每个线程在特定时间点上可能分别执行这个程序的不同部分。
创建和被创建的线程同先前一样共享内存空间、文件描述符和其它各种系统资源。例如, 当一个线程修改了一个变量的值,随后其它线程就会看到这个修改过的值。相似的,如果一个线程关闭了一个文件描述符,其它线程也无法从这个文件描述符进行读或写操作。因为一个进程中所有线程只能执行同一个程序,如果任何一个线程调用了一个 exec 函数,所有其它线程就此终止。
创建线程
进程中的每个线程都以线程 ID 标识。在 C 或 C++ 程序中,线程 ID 被表示为pthread_t 类型的值。
pthread_t thread_id; //定义一个线程id
函数 pthread_create 负责创建新线程。你需要给它提供如下信息:
- 一个指向 pthread_t 类型变量的指针;新线程的线程 ID 将存储在这里。
- 一个指向线程属性(thread attribute) 对象的指针。这个对象控制着新线程与程序其它部分交互的具体细节。如果传递 NULL 作为线程属性,新线程将被赋予一组默认线程属性。
- 一个指向线程函数的指针。这是一个普通的函数指针,类型如下:void* () (void)
- 一个线程参数,类型 void*。不论你传递什么值作为这个参数,当线程开始执行的时候,它都会被直接传递给新的线程。
注意:编译带有线程相关头文件时,要增加-lpthread的编译选项;如:# gcc -o pthread pthread.c -lpthread
/*================================================================
* Copyright (C) 2019. All rights reserved.
*
* 文件名称:pthread.c
* 创 建 者:
* 创建日期:2019年07月30日
* 描 述:
*
================================================================*/
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t rd = PTHREAD_MUTEX_INITIALIZER;
/* 打印字符'x',到标准错误输出 */
void* print_xs(void* unused) {
while(1) {
// pthread_mutex_lock(&rd);
printf("x\n");
usleep(1000);
//pthread_mutex_unlock(&rd);
}
return NULL;
}
/* 主程序 */
int main() {
pthread_t thread_id;
/* 构造新线程,新线程将执行print_xs函数 */
pthread_create(&thread_id, NULL, print_xs, NULL);
sleep(1);
/* 不断输出字符'o'到标准错误输出 */
while(1){
//pthread_mutex_lock(&rd);
usleep(1000);
printf("o\n");
usleep(1000);
//pthread_mutex_unlock(&rd);
}
pthread_join(thread_id, NULL);
return 0;
}
函数意义就是分别针对2个线程,观察他们执行的顺序,由于linux是在不断调度这2个线程的,所以看到的现象应该是’o’、‘x’交替输出。但在上述代码没有增加sleep之前,只能看到’o’的输出而看不到’x’的输出,增加了延时后,可以看到输出一段’x’输出一段’o’,原因是由于线程在系统中是以抢占时间片的方式来执行,没有增加sleep时,可能print_xs的线程抢到时间片了,但是由于打印的原因没有看出来,增加sleep,使这2个线程都有充分的时间进行时间片调度,才能看到效果;