⑴ linux下c语言编程线程有什么好处呢
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
线程的划分尺度小于进程,使得多线程程序的并发性搞。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。
一般你运行一个应用程序,就生成了一个进程, 这个进程拥有自己的内存空间,
这个进程还可以内部生成多个线程, 这些线程之间共用一个进程的内存空存空间,所以线程之间共享内存是很容易做到的,多线程协作比多进程协作快一些,而且安全.
在windows跟unix上面,进程,线程的实现方法都是不一样的.
⑵ C语言如何让结束指定进程中的指定线程
终止线程有三种方法:
1.线程可以在自身内部调用AfxEndThread()来终止自身的运行
2.可以在线程的外部调用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )来强行终止一个线程的运行,
然后调用CloseHandle()函数释放线程所占用的堆栈
3.第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止。
unsigned long __cdecl _beginthread (void (__cdecl *) (void *),
unsigned, void *); PS--这是我复制的别人的
⑶ C语言创建线程或者子进程后要用if else
fork 是用来创建子进程的, 而不是线程( 线程创建需要用到 pthread_create )
需要根据 fork() 的返回值来判断下面的代码是在父进程(返回pid>0)中还是子进程(返回0)中. 像上面的代码中 if 中的代码被在子进程中执行, else 中的代码在父进程中执行.
⑷ C语言的代码执行过程中,整个代码运行过程是一个进程,而其中每一条语句和操作是一个线程么
操作系统中的多线程和多进程是需要通过编程实现的,需要写程序时通过函数去创建进程或者线程。如果只是一个普通方式写的C语言程序只是一个线程或者进程而已
⑸ C语言中 怎么实现双线程 或者 父子线程啊
运行一个程序,这个运行实体就是一个“进程”。
例如,用鼠标双击IE浏览器的图标,你运行了一个IE“进程”。第一个窗未关,你又用鼠标双击IE浏览器的图标,又出来一个浏览器的窗。这时,你运行了同一个程序的两个进程。
对于自己写的程序也如此。运行它,这个运行实体就是一个“进程”。同时运行两个,就是两个进程。计算机分别对两个进程分配资源,直到进程结束,收回资源。
线程是进程里真真跑的线路,真真执行的运算,每个进程有一个主线程。进程里可以开第二第三条新的执行线路,gcc 用 pthread_create(),VC++ 用 CreateThread(), 这就叫双线程和多线程。进程是线程的容器,同一进程的线程共享它们进程的资源。线程里建的线程就是父子线程。
两个或多个进程协同工作时,需要互相交换信息,有些情况下进程间交换的少量信息,有些情况下进程间交换大批信息。这就要通讯。通讯方式不止一种。管道就是一种。VC++ 用 CreatePipe() 函数建立。
管道的实质是一个共享文件,可借助于文件系统的机制实现,创建、打开、关闭和读写.
一个进程正在使用某个管道写入或读出数据时,另一个进程就必须等待. 发送者和接收者双方必须知道对方是否存在,如果对方已经不存在,就没有必要再发送信息.,发送信息和接收信息之间要协调,当写进程把一定数量的数据写入管道,就去睡眠等待,直到读进程取走数据后,把它唤醒。
VC++ 线程例子:
#include <windows.h>
#include <iostream.h>
DWORD WINAPI fun1(LPVOID lp);
DWORD WINAPI fun2(LPVOID lp);
int piao=500;
int main()
{
HANDLE pthread1,pthread2;
pthread1=CreateThread(0,0,fun1,0,0,0);
pthread2=CreateThread(0,0,fun2,0,0,0);
CloseHandle(pthread1);
CloseHandle(pthread2);
Sleep(3000);
return 0;
}
DWORD WINAPI fun1(LPVOID lp)
{
while(1)
{
if(piao>0)
cout<< "thread-1-"<< piao--<<endl;
else
break;
}
return 0;
}
DWORD WINAPI fun2(LPVOID lp)
{
while(1)
{
if(piao>0)
cout<<"thread-2-"<<piao--<<endl;
else
break;
}
return 0;
}
===================================
建管道函数原形:
BOOL CreatePipe(
PHANDLE hReadPipe, // read handle
PHANDLE hWritePipe, // write handle
LPSECURITY_ATTRIBUTES lpPipeAttributes, // security attributes
DWORD nSize // pipe size
);
⑹ c语言怎么创建线程和使用
进程的生命周期:
[1].创建 --- fork
[2].执行 --- a. exec
b.子进程实现代码逻辑
[3].结束 --- exit _exit
僵尸态进程---wait waitpid
孤儿进程
--------------------------------------
进程存在的问题:
(1).进程的创建 --- 复制
(时间 和 空间的开销很大)
(2).进程的运行 --- 调度-->
⑺ C语言中如何让线程等待进程执行完一部分后,线程再继续执行
#include"afxmt.h"
//全局变量
CEventevent(FALSE,TRUE);//第二个参数为TRUE表示手动信号
event.SetEvent();
//线程中要等待的地方
WaitForSingleObject(event,INFINITE)//永远等待
......//线程中的代码
event.ResetEvent();//线程挂起
//-----------------------------------------------------
//以上代码C好像不行,可以用笨办法
//定义一个全局标识变量intflag=0;
//在线程中
while(flag==0)//在主线程中改变flag的值,一旦不为0,则执行线程中的代码
{
Sleep(1);
}
......//线程要执行的功能
⑻ c语言线程问题,在不影响目的的情况下修改
所谓worker 线程,是指完全不牵扯到图形用户界面(GUI),纯粹做运算的
:你不可以依赖“因线程的结束而清理所有被这一线程产生的核心对象”。许多对象,例如文件,是被进程拥有,而非被线程拥有。
在进程结束之前不能够清理它们。
CloseHandle( )唯一做的事情就是把引用计数减1。如果该值变成0,对象会自动被操作系统摧毁。
Win32 说明文件一再强调线程分为GUI 线程和worker 线程两种。GUI 线程负责建造窗口以及处理主消息循环。worker 负责执行纯粹运算工作,如重新
计算或重新编页等等,它们会导致主线程的消息队列失去反应。一般而言,GUI
线程绝不会去做那些不能够马上完成的工作。
1. 各线程的数据要分离开来,避免使用全局变量。2. 不要在线程之间共享GDI 对象。
3. 确定你知道你的线程状态。不要径自结束程序而不等待它们的结束。
4. 让主线程处理用户界面(UI)。
这是我在看完一本线程的书,然后写的
具体你的主要问题是:不要试图让回答你的问题 的人来给你找问题,你得自己找出问题,或哪里输出不对,然后再问
-物联网校企联盟技术部