一.进程与线程
进程:
进程是操作系统中分配资源的最小单位,每个进程 都拥有独立的内存空间、代码段、数据段、堆栈和文件描述符等资源,进程之间通常需要通过 进程间通信(IPC)机制进行数据交换和协同操作。但是创建和销毁进程的开销较大,而且进 程之间通信的机制比较复杂。
线程:
线程(thread)是进程中的一个执行流程,是操作系统中调度的最小单位,每个线程都共 享同一进程的资源,包括内存空间、文件描述符等。线程之间可以通过共享内存和同步机制进 行数据交换和协同操作,相对于进程,线程的创建和销毁开销较小,可以更加高效地利用系统 资源,提高程序的并发性能和响应能力。
二.线程的创建
使用 pthread_create()函数对线程进行创建,pthread_create()函数使用的头文件和函数原型, 如下所示:
所需头文件:
#include <pthread.h>
函数原型:
int pthread_create(pthread_t *thread, const pthread_attr_t
*attr,void *(*start_routine) (void *), void *arg);
示例:
#include <stdio.h>
#include <pthread.h>
void* print_message(void* str)
{
printf("%s\n", (char*) str); // 打印传入的字符串
return NULL;
}
int main()
{
pthread_t thread_id; // 线程 ID
char* message = "你好,线程!"; // 传给新线程的字符串指针
int result;
result = pthread_create(&thread_id, NULL, print_message, (void*) message);
// 创建新线程并传入参数
if (result != 0)
{
printf("错误:创建新线程失败。\n"); // 如果创建新线程失败则输出错误信息
return -1;
}
printf("主线程结束。\n"); // 主线程输出信息
return 0;
}
三.对线程中的while进行优化
程序原型:不添加延时。
#include <stdio.h>
#include <pthread.h>
void* print_message(void* str)
{
while(1)
{
printf("%s\n", (char*) str); // 打印传入的字符串
}
return NULL;
}
int main()
{
pthread_t thread_id; // 线程 ID
char* message = "你好,线程!"; // 传给新线程的字符串指针
int result;
result = pthread_create(&thread_id, NULL, print_message, (void*) message);
// 创建新线程并传入参数
if (result != 0)
{
printf("错误:创建新线程失败。\n"); // 如果创建新线程失败则输出错误信息
return -1;
}
printf("主线程结束。\n"); // 主线程输出信息
return 0;
}
在不加延时的情况下top的CPU占用率是1.5.
添加延时:usleep(100*1000);
#include <stdio.h>
#include <pthread.h>
void* print_message(void* str)
{
while(1)
{
usleep(100*1000);
printf("%s\n", (char*) str); // 打印传入的字符串
}
return NULL;
}
int main()
{
pthread_t thread_id; // 线程 ID
char* message = "你好,线程!"; // 传给新线程的字符串指针
int result;
result = pthread_create(&thread_id, NULL, print_message, (void*) message);
// 创建新线程并传入参数
if (result != 0)
{
printf("错误:创建新线程失败。\n"); // 如果创建新线程失败则输出错误信息
return -1;
}
printf("主线程结束。\n"); // 主线程输出信息
return 0;
}
在添加延时usleep(100*1000)的情况下top的CPU占用率是0.6.
四.疯狂创建线程是不允许的
程序原型:
#include <stdio.h>
#include <pthread.h>
void* print_message(void* str)
{
printf("%s\n", (char*) str); // 打印传入的字符串
return NULL;
}
int main()
{
pthread_t thread_id; // 线程 ID
char* message = "你好,线程!"; // 传给新线程的字符串指针
int result;
while(1)
{
result = pthread_create(&thread_id, NULL, print_message, (void*) message);
}
// 创建新线程并传入参数
if (result != 0)
{
printf("错误:创建新线程失败。\n"); // 如果创建新线程失败则输出错误信息
return -1;
}
printf("主线程结束。\n"); // 主线程输出信息
return 0;
}
结果:进程奔溃,黑屏。