程序,进程线程的区别:
程序:以文件的形式存储在磁盘上的,他是计算机指令的集合;
进程:一个正在运行的程序实例,是一个程序在其自身的地址空间中的一次执行活动;
进程使用系统中的内存,而程序不使用内存, 不能被系统调度, 也不能作为独立运行的单位,所以它不占用系统的内存;
进程是不活泼的。进程从来不执行任何东西,他只是线程的容器。若要使进程完成某项操作,它必须拥有一个在他的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。
单个进程可能包含若干个线程,这些线程都“同时”执行进程地址空间中的代码;
每个进程至少有一个线程,来执行进程的地址空间中的代码,当创建一个线程是,操作系统会自动创建这个进程中的第一个线程,称为主线程,如main函数,WinMain函数,然后该线程可以创建其他线程;
线程:因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程;多
多线程例子:
#include <iostream>
#include <windows.h>
using namespace std;
int i = 1000;
DWORD WINAPI fun1(
LPVOID lpParameter
);
DWORD WINAPI fun2(
LPVOID lpParameter
);
HANDLE hMutex;
int main()
{
HANDLE Thread1;
HANDLE Thread2;
Thread1 = CreateThread(NULL, 0, fun1, NULL, 0, 0);
Thread2 = CreateThread(NULL, 0, fun2, NULL, 0, 0);
CloseHandle(Thread1);
CloseHandle(Thread2);
hMutex = CreateMutex(NULL, FALSE, NULL);//创建互斥对象
while (i>0)
{
WaitForSingleObject(hMutex, INFINITE);//如果hMutex为有信号状态,进入函数, 如果是无信号状态等待INFINITE个时间;
cout << "主线程" << i << endl;
i--;
ReleaseMutex(hMutex);//释放互斥对象
}
return 0;
}
DWORD WINAPI fun1(
LPVOID lpParameter
)
{
while (i>0)
{
//INFINITE为一直等待,
WaitForSingleObject(hMutex, INFINITE);//如果hMutex为有信号状态,进入函数, 如果是无信号状态等待INFINITE个时间;
cout <<"fun1线程"<< i << endl;
i--;
ReleaseMutex(hMutex);//释放互斥对象
}
return 0;
}
DWORD WINAPI fun2(
LPVOID lpParameter
)
{
while (i>0)
{
WaitForSingleObject(hMutex, INFINITE);//如果hMutex为有信号状态,进入函数, 如果是无信号状态等待INFINITE个时间;
cout << "fun2线程" << i << endl;
i--;
ReleaseMutex(hMutex);//释放互斥对象
}
return 0;
}
引入互斥对象
CreateMutex(NULL, FALSE, NULL);
是为了让线程同步