linux中的线程问题

我程序的源代码: /* File sem.c */

#include

#include

#include

#define MAXSTACK 100

int stack[MAXSTACK][2];

int size=0;

sem_t sem;

/* 从文件1.dat读取数据,每读一次,信号量加一*/

void ReadData1(void){

FILE *fp=fopen("1.dat","r");

while(!feof(fp)){

fscanf(fp,"%d %d",&stack[0],&stack[1]);

sem_post(&sem);

++size;

}

fclose(fp);

}

/*从文件2.dat读取数据*/

void ReadData2(void){

FILE *fp=fopen("2.dat","r");

while(!feof(fp)){

fscanf(fp,"%d %d",&stack[0],&stack[1]);

sem_post(&sem);

++size;

}

fclose(fp);

}

/*阻塞等待缓冲区有数据,读取数据后,释放空间,继续等待*/

void HandleData1(void){

while(1){

sem_wait(&sem);

printf("Plus:%d+%d=%d\n",stack[0],stack[1],

(int)stack[0]+(int)stack[1]);

--size;

}

}

void HandleData2(void){

while(1){

sem_wait(&sem);

printf("Multiply:%d*%d=%d\n",stack[0],stack[1],

(int)stack[0]*(int)stack[1]);

--size;

}

}

int main(void){

pthread_t t1,t2,t3,t4;

sem_init(&sem,0,0);

pthread_create(&t1,NULL,(void *)HandleData1,NULL);

pthread_cancel(t1);

pthread_create(&t2,NULL,(void *)HandleData2,NULL);

pthread_cancel(t2);

pthread_create(&t3,NULL,(void *)ReadData1,NULL);

pthread_cancel(t3);

pthread_create(&t4,NULL,(void *)ReadData2,NULL);

pthread_cancel(t1);

/* 防止程序过早退出,让它在此无限期等待*/

pthread_join(t1,NULL);

sleep(5)

}

;1.dat文件是:1 2 3 4 5 6 7 8 9

2.dat文件是:-1 -2 -3 -4 -5 -6 -7 -8 -9

为什么一运行就没结果了?我实在命令行形式中运行的,也没办法退出了?哪位高手帮忙处理一下,谢了!

1个回答

WINDOS里的进程/线程是继承自OS/2的。在WINDOS里,"进程"是指一个程序,而"线程"是一个"进程"里的一个执行"线索"。从核心上讲, WINDOS的多进程与Linux并无多大的区别,在WINDOS里的线程才相当于Linux的进程,是一个实际正在执行的代码。但是,WINDOS里同一个进程里各个线程之间是共享数据段的。这才是与Linux的进程最大的不同。
下面这段程序显示了WINDOS下一个进程如何启动一个线程。  int g; DWORD WINAPI ChildProcess( LPVOID lpParameter ){ int i; for ( i = 1; i <1000; i ++) { g ++; printf( "This is Child Thread: %d", g ); } ExitThread( 0 ); };  void main() { int threadID; int i; g = 0; CreateThread( NULL, 0, ChildProcess, NULL, 0, &threadID ); for ( i = 1; i <1000; i ++) { g ++; printf( "This is Parent Thread: %d", g ); } }
在WINDOS下,使用CreateThread函数创建线程,与Linux下创建进程不同,WINDOS线程不是从创建处开始运行的,而是由 CreateThread指定一个函数,线程就从那个函数处开始运行。此程序同前面的UNIX程序一样,由两个线程各打印1000条信息。 threadID是子线程的线程号,另外,全局变量g是子线程与父线程共享的,这就是与Linux最大的不同之处。大家可以看出,WINDOS的进程/线程要比Linux复杂,在Linux要实现类似WINDOS的线程并不难,只要fork以后,让子进程调用ThreadProc函数,并且为全局变量开设共享数据区就行了,但在WINDOS下就无法实现类似fork的功能了。所以现在WINDOS下的C语言编译器所提供的库函数虽然已经能兼容大多数Linux/UNIX的库函数,但却仍无法实现fork。
对于多任务系统,共享数据区是必要的,但也是一个容易引起混乱的问题,在WINDOS下,一个程序员很容易忘记线程之间的数据是共享的这一情况,一个线程修改过一个变量后,另一个线程却又修改了它,结果引起程序出问题。但在Linux下,由于变量本来并不共享,而由程序员来显式地指定要共享的数据,使程序变得更清晰与安全。
至于WINDOS的"进程"概念,其含义则是"应用程序",也就是相当于UNIX下的exec了。

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

精华知识

linux中线程的问题,linux中的线程问题相关推荐

  1. Linux系统编程----12(线程概念,Linux线程实现原理,栈中ebp指针和ebp指针,线程的优缺点和共享资源)

    线程概念 什么是线程 在一个程序里的一个执行路线就叫做线程(thread). 更准确的定义是:线程是"一个进程内部的控制序列" 一切进程至少都有一个执行线程 线程在进程内部运行,本 ...

  2. Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 ...

  3. Linux+c+线程的属性,C ++中的多线程

    多线程是多任务的一种特殊形式,多任务是一种功能,它使您的计算机可以同时运行两个或多个程序.通常,多任务有两种类型:基于进程和基于线程. 基于进程的多任务处理程序的并发执行.基于线程的多任务处理并发执行 ...

  4. linux 多核线程 调度,通过轻型线程提高多核设备中的Linux实时性能

    但请您稍稍考虑一下.采用上文提到的 Linux 实时扩展怎么样?是的,PREEMPT_RT 可以解决 Linux 内核中存在的许多关于响应性的问题,但不能真正解决多线程问题.实施用户空间 Linux ...

  5. 一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 栈是什么?栈有什么作用? 首先,栈 (stack) ...

  6. Linux中的各种栈:进程栈 线程栈 内核栈 中断栈

    Linux中的各种栈:进程栈 线程栈 内核栈 中断栈 栈的作用 1. 函数调用 2. 多任务支持 Linux 中有几种栈?各种栈的内存位置? 1. 进程栈 2. 线程栈 3. 进程内核栈 4. 中断栈 ...

  7. linux查询某域线程是否满了,Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活...

    pthread_kill: 别被名字吓到,pthread_kill可不是kill,而是向线程发送signal.还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用sig ...

  8. 【Linux 线程】同一个进程中的线程共享哪些资源

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线 ...

  9. linux中ftp的用法,linux中的ftp命令用法(7页)-原创力文档

    第 第 PAGE 1 页 共 NUMPAGES 1 页 linux中的ftp命令用法 Linux系统中的ftp命令功能强大,那么它的具体用法是怎样呢?下面由小编为大家整理了linux中的ftp命令用法 ...

最新文章

  1. oracle11g ora 29927,【案例】Oracle内存泄漏 进行10046跟踪分析07445导致数据库宕机
  2. 消息称中国商务部已批准高通收购恩智浦
  3. python django报错 no such column:
  4. 面试又挂了,你理解了 Java 8 的 Consumer、Supplier、Predicate和Function吗?
  5. c语言可移植性较差吗,c陷阱与缺陷--可移植性缺陷
  6. pi数据库系统中国服务器,基于PI数据库的服务器实时监控系统研究与开发
  7. (1) redis windows安装
  8. 腾讯智慧交通战略重磅升级 打造以人为中心的未来交通
  9. 增大mysql修改表空间_innodb系统表空间维护方法
  10. 波特率与频率的换算公式?_高中物理公式总结表
  11. xftp找不到匹配的outgoing encryption 算法 怎么解决
  12. [渝粤教育] 南京邮电大学 Python语言程序设计基础 参考 资料
  13. matlab车牌识别课程设计报告模板(附源代码)
  14. STM32驱动步进电机测试
  15. 删除计算机用户时拒绝访问权限,c盘为什么拒绝访问 删除c盘文件需要管理员权限怎么办...
  16. mysql 从多个表中删除行,MySQL从多个表中删除行
  17. C++:onnxruntime调用FasterRCNN模型
  18. naming conflicts with other components【vue3】
  19. python程序员加班多吗_程序员加班严重,如何才能不加班
  20. 游戏手机低迷,黑鲨、红魔花式求生

热门文章

  1. 在JavaScript中从base64字符串创建Blob
  2. 方法和函数有什么区别?
  3. 如何在Python中串联两个列表?
  4. win11的drivers文件可以删除吗 windows11drivers文件是否可以删除的详细介绍
  5. java 变量 安全访问_访问java变量
  6. 协议:Modbus通讯协议详细
  7. 仿制波形驱动机器人- SAW
  8. 移动机器人速度空间对比分析
  9. 计算机文档我的文档丢失,“我的文档”不见了如何找回?几种解决“我的文档不见了”的办法...
  10. 实验4-2-8 输出整数各位数字 (15 分)