当前位置:首页 » 编程语言 » c语言读写锁
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言读写锁

发布时间: 2022-01-15 09:33:57

1. c语言读写文件如何判断某文件被占用

FILE*fp;
if((fp=fopen("文件名","r"))==NULL)
{
printf("无法打开文件....");
}

2. unix c中文件读写锁的问题。

其实读写锁和读写操作本身没有联系。他们是相互独立的。
锁的作用就是让一个线程判断当前文件有没有另一个线程正在操作。
a线程给文件加上写锁,对于其他线程并不代表它不可写。它只是告诉其他线程,有线程正在操作这个文件等我解锁了你们再操作。如果有人不检查锁的状态,直接open 和 write操作依旧可以成功,只不过两个线程同时写入数据,文件数据就被破坏了。
所以在open 和 write之前要对文件加写锁,如果有其他线程正在操作文件,加锁过程会被阻塞,直到文件解锁。

在所有线程中必须在执行文件操作给文件加锁以等待锁的状态。

3. linux下,我试验了下,串口可以被同时打开多次。我想问串口怎么以独占方式打开

没有办法。现在的minicom 软件还不够完善。
如果你在C语言中访问串口,可以加读写锁。至于具体操作,不是几句话能说明白的。这需要你自己查找资料。

4. 嵌入式和Linux操作系统(仅限于专业人士解答,谢谢!)

1,linux 是一个操作系统,和我们常用的Windows操作系统一样,只不过一般人pc上不习惯用linux操作系统。
2,Linux具有开放免费的优点, 其实安卓的内核就是linux,linux还普遍用在服务器。可以直接在网上下载。
3,学习嵌入式,1,linux系统的基本操作 ,2linux 系统编程,3,inux 设备驱动开发(包括各种接口驱动开发, iic pci lcd Flash)。 4,arm开发板的使用,内核移植驱动移植,。

4,二级c的基础就够了,
5,入门的话只要花时间两个月就行,学好不好说看个人。
6,不用c++和java,若你会当然更好。

5. 分析怎样实现的对共享存储区的互斥和同步

你说的这个是远程监控和备份,需要在PC1上登录客户端软件通过花生壳或其他域名服务器域名解析出去,然后你在PC2上面通过解析出来的域名登录上去进行监控和存储即可。不过远程监控效果很一般,图像也不连续,除非你是光线上网这样才会好一点。

6. 东秦的操作系统答案第二章

第二章
1. 什么是前趋图?为什么要引入前趋图?
答:前趋图(Precedence Graph)是一个有向无循环图,记为DAG(Directed Acyclic
Graph),用于描述进程之间执行的前后关系。
2. 画出下面四条语句的前趋图:
S1=a:=x+y; S2=b:=z+1; S3=c:=a – b; S4=w:=c+1;
答:其前趋图为:
3. 什么程序并发执行会产生间断性特征?
答:程序在并发执行时,由于它们共享系统资源,为完成同一项任务需要相互合作,致使这
些并发执行的进程之间,形成了相互制约关系,从而使得进程在执行期间出现间断性。
4.程序并发执行时为什么会失去封闭性和可再现性?
答:程序并发执行时,多个程序共享系统中的各种资源,因而这些资源的状态由多个程序改变,致使程序运行失去了封闭性,也会导致其失去可再现性。
5.在操作系统中为什么要引入进程概念?它会产生什么样的影响?
答:为了使程序在多道程序环境下能并发执行,并对并发执行的程序加以控制和描述,在操作系统中引入了进程概念。
影响: 使程序的并发执行得以实行。
6.试从动态性,并发性和独立性上比较进程和程序?
答:(1)动态性是进程最基本的特性,表现为由创建而产生,由调度而执行,因得不到资源
而暂停执行,由撤销而消亡。进程有一定的生命期,而程序只是一组有序的指令集合,是静
态实体。
(2)并发性是进程的重要特征,同时也是OS 的重要特征。引入进程的目的正是为了使
其程序能和其它进程的程序并发执行,而程序是不能并发执行的。
(3)独立性是指进程实体是一个能独立运行的基本单位,也是系统中独立获得资源和独
立调度的基本单位。对于未建立任何进程的程序,不能作为独立单位参加运行。
7.试说明PCB 的作用,为什么说PCB 是进程存在的惟一标志?
答:PCB 是进程实体的一部分,是操作系统中最重要的记录型数据结构。作用是使一个在
多道程序环境下不能独立运行的程序,成为一个能独立运行的基本单位,成为能与其它进程
并发执行的进程。OS是根据PCB对并发执行的进程进行控制和管理的。
8.试说明进程在三个基本状态之间转换的典型原因。
答: (1)就绪状态→执行状态:进程分配到CPU资源
(2)执行状态→就绪状态:时间片用完
(3)执行状态→阻塞状态:I/O请求
(4)阻塞状态→就绪状态:I/O完成
9.为什么要引入挂起状态?该状态有哪些性质?
答:引入挂起状态处于五种不同的需要: 终端用户需要,父进程需要,操作系统需要,对换
北京石油化工学院信息工程学院计算机系5/48
《计算机操作系统》习题参考答案余有明与计07和计G09的同学们编着 5/48
需要和负荷调节需要。处于挂起状态的进程不能接收处理机调度。
10.在进行进程切换时,所要保存的处理机状态信息有哪些?
答:进行进程切换时,所要保存的处理机状态信息有:
(1)进程当前暂存信息
(2)下一指令地址信息
(3)进程状态信息
(4)过程和系统调用参数及调用地址信息。
11.试说明引起进程创建的主要事件。
答:引起进程创建的主要事件有:用户登录、作业调度、提供服务、应用请求。
12.试说明引起进程被撤销的主要事件。
答:引起进程被撤销的主要事件有:正常结束、异常结束(越界错误、保护错、非法指令、
特权指令错、运行超时、等待超时、算术运算错、I/O 故障)、外界干预(操作员或操作系
统干预、父进程请求、父进程终止)。
13.在创建一个进程时所要完成的主要工作是什么?
答:
(1)OS 发现请求创建新进程事件后,调用进程创建原语Creat();
(2)申请空白PCB;
(3)为新进程分配资源;
(4)初始化进程控制块;
(5)将新进程插入就绪队列.
14.在撤销一个进程时所要完成的主要工作是什么?
答:
(1)根据被终止进程标识符,从PCB 集中检索出进程PCB,读出该进程状态。
(2)若被终止进程处于执行状态,立即终止该进程的执行,置调度标志真,指示该进程被
终止后重新调度。
(3)若该进程还有子进程,应将所有子孙进程终止,以防它们成为不可控进程。
(4)将被终止进程拥有的全部资源,归还给父进程,或归还给系统。
(5)将被终止进程PCB 从所在队列或列表中移出,等待其它程序搜集信息。
15.试说明引起进程阻塞或被唤醒的主要事件是什么?
答:a. 请求系统服务;b. 启动某种操作;c. 新数据尚未到达;d. 无新工作可做.
16.进程在运行时存在哪两种形式的制约?并举例说明之。
答:
(1)间接相互制约关系。举例:有两进程A 和B,如果A 提出打印请求,系统已把唯一的
一台打印机分配给了进程B,则进程A 只能阻塞;一旦B 释放打印机,A 才由阻塞改为就
绪。
(2)直接相互制约关系。举例:有输入进程A 通过单缓冲向进程B 提供数据。当缓冲空时,
计算进程因不能获得所需数据而阻塞,当进程A 把数据输入缓冲区后,便唤醒进程B;反
之,当缓冲区已满时,进程A 因没有缓冲区放数据而阻塞,进程B 将缓冲区数据取走后便
唤醒A。
17.为什么进程在进入临界区之前应先执行“进入区”代码?而在退出前又要执行“退出
区”代码?
答:为了实现多个进程对临界资源的互斥访问,必须在临界区前面增加一段用于检查欲访问
的临界资源是否正被访问的代码,如果未被访问,该进程便可进入临界区对资源进行访问,
并设置正被访问标志,如果正被访问,则本进程不能进入临界区,实现这一功能的代码为"
北京石油化工学院信息工程学院计算机系6/48
《计算机操作系统》习题参考答案余有明与计07和计G09的同学们编着 6/48
进入区"代码;
在退出临界区后,必须执行"退出区"代码,用于恢复未被访问标志,使其它进程能再访问此
临界资源。
18. 同步机构应遵循哪些基本准则?为什么?
答:同步机构应遵循的基本准则是:空闲让进、忙则等待、有限等待、让权等待
原因:为实现进程互斥进入自己的临界区。
19. 试从物理概念上说明记录型信号量wait 和signal。
答:wait(S):当S.value>0 时,表示目前系统中这类资源还有可用的。执行一次wait 操
作,意味着进程请求一个单位的该类资源,使系统中可供分配的该类资源减少一个,因此描
述为S.value:=S.value-1;当S.value<0时,表示该类资源已分配完毕,进程应调用block
原语自我阻塞,放弃处理机,并插入到信号量链表S.L中。
signal(S):执行一次signal操作,意味着释放一个单位的可用资源,使系统中可供分配
的该类资源数增加一个,故执行S.value:=S.value+1 操作。若加1 后S.value≤0,则表
示在该信号量链表中,仍有等待该资源的进程被阻塞,因此应调用wakeup 原语,将S.L
链表中的第一个等待进程唤醒。
20.你认为整型信号量机制是否完全遵循了同步机构的四条准则?
答:整型信号量机制不完全遵循同步机制的四条准则,它不满足“让权等待”准则。
21.如何利用信号量机制来实现多个进程对临界资源的互斥访问?并举例说明之。
答:为使多个进程互斥访问某临界资源,只需为该资源设置一互斥信号量mutex,并设其
初值为1,然后将各进程访问该资源的临界区CS置于wait(mutex)和signal(mutex)操作
之间即可。这样,每个欲访问该临界资源的进程在进入临界区之前,都要先对mutex 执行
wait 操作,若该资源此刻未被访问,本次wait 操作必然成功,进程便可进入自己的临界区,
这时若再有其他进程也欲进入自己的临界区,此时由于对mutex 执行wait操作定会失败,
因而该进程阻塞,从而保证了该临界资源能被互斥访问。当访问临界资源的进程退出临界区
后,应对mutex执行signal 操作,释放该临界资源。利用信号量实现进程互斥的进程描述
如下:
Var mutex: semaphore:=1;
begin
parbegin
process 1: begin
repeat
wait(mutex);
critical section
signal(mutex);
remainder seetion
until false;
end
process 2: begin
repeat
wait(mutex);
critical section
signal(mutex);
remainder section
until false;
end
parend

22.试写出相应的程序来描述图2-17所示的前驱图。

答:(a)Var a, b, c, d, e, f, g, h; semaphore:= 0, 0, 0, 0, 0, 0, 0, 0;
begin
parbegin
begin S1; signal(a); signal(b); end;
begin wait(a); S2; signal(c); signal(d); end;
begin wait(b); S3; signal(e); end;
begin wait(c); S4; signal(f); end;
begin wait(d); S5; signal(g); end;
begin wait(e); S6; signal(h); end;
begin wait(f); wait(g); wait(h); S7; end;
parend
end
(b)Var a, b, c, d, e, f, g, h,i,j; semaphore:= 0, 0, 0, 0, 0, 0, 0,0,0, 0;
begin
parbegin
begin S1; signal(a); signal(b); end;
begin wait(a); S2; signal(c); signal(d); end;
begin wait(b); S3; signal(e); signal(f); end;
begin wait(c); S4; signal(g); end;
begin wait(d); S5; signal(h); end;
begin wait(e); S6; signal(i); end;
begin wait(f); S7; signal(j); end;
begin wait(g);wait(h); wait(i); wait(j); S8; end;
parend
end
23.在生产者消费者问题中,如果缺少了signal(full)或signal(empty),对执行结果有何影响?
答:
如果缺少signal(full),那么表明从第一个生产者进程开始就没有改变信号量full 值,
即使缓冲池产品已满,但full 值还是0,这样消费者进程执行wait(full)时认为缓冲池是空
而取不到产品,消费者进程一直处于等待状态。
如果缺少signal(empty),在生产者进程向n个缓冲区投满产品后消费者进程才开始从
中取产品,这时empty=0,full=n,那么每当消费者进程取走一个产品empty 值并不改变,
直到缓冲池取空了,empty 值也是0,即使目前缓冲池有n 个空缓冲区,生产者进程要想
再往缓冲池中投放产品也会因为申请不到空缓冲区被阻塞。
24.在生产消费者问题中,如果将两个wait 操作即wait(full)和wait(mutex)互换位置,
或者将signal(mutex)与signal(full)互换位置,结果如何?
答:将wait(full)和wait(mutex)互换位置后,可能引起死锁。考虑系统中缓冲区全满时,
若一生产者进程先执行了wait(mutex)操作并获得成功,则当再执行wait(empty)操作时,
它将因失败而进入阻塞状态,它期待消费者进程执行signal(empty)来唤醒自己,在此之前,
它不可能执行signal(mutex)操作,从而使试图通过执行wait(mutex)操作而进入自己的临
界区的其他生产者和所有消费者进程全部进入阻塞状态,这样容易引起系统死锁。
若signal(mutex)和signal(full)互换位置后只是影响进程对临界资源的释放次序,而
不会引起系统死锁,因此可以互换位置。
25.我们在为某一临界资源设置一把锁W,当W=1时表示关锁,当W=0时表示锁已打开。
试写出开锁和关锁的原语,并利用他们实现互斥。
答:整型信号量:lock(W): while W=1 do no-op
W:=1;
unlock(W): W:=0;
记录型信号量:lock(W): W:=W+1;
if(W>1) then block(W, L)
unlock(W): W:=W-1;
if(W>0) then wakeup(W, L)
例子:
Var W:semaphore:=0;
begin
repeat
lock(W);
critical section
unlock(W);
remainder section
until false;
end

26.试修改下面生产者-消费者问题解法中的错误:
答: procer:
begin
repeat

procer an item in nextp;
wait(mutex);
wait(full); /* 应为wait(empty),而且还应该在wait(mutex)的前面 */
buffer(in):=nextp;
/* 缓冲池数组游标应前移: in:=(in+1) mod n; */
signal(mutex);
/* signal(full); */
until false;
end
consumer:
begin
repeat
wait(mutex);
wait(empty); /* 应为wait(full),而且还应该在wait(mutex)的前面 */
nextc:=buffer(out);
out:=out+1; /* 考虑循环,应改为: out:=(out+1) mod n; */
signal(mutex);/* signal(empty); */
consumer item in nextc;
until false;
end
27.试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法.
答:Var chopstick:array[0,…,4] of semaphore;
所有信号量均被初始化为1,第i 位哲学家的活动可描述为:
Repeat
Wait(chopstick[i]);
Wait(. chopstick[(i+1) mod 5]);

Ea.t ;

Signal(chopstick[i]);
Signal(chopstick[(i+1) mod 5])
Ea.t ;

Think;
Until false;

28.在测量控制系统中的数据采集任务,把所采集的数据送一单缓冲区;计算任务从该单
缓冲中取出数据进行计算.试写出利用信号量机制实现两者共享单缓冲的同步算法。
答:
a. Var mutex, empty, full: semaphore:=1, 1, 0;
gather:
begin
repeat
……
gather data in nextp;
wait(empty);
wait(mutex);
buffer:=nextp;
signal(mutex);
signal(full);
until false;
end
compute:
begin
repeat
……
wait(full);
wait(mutex);
nextc:=buffer;
signal(mutex);
signal(empty);
compute data in nextc;
until false;
end
b. Var empty, full: semaphore:=1, 0;
gather:
begin
repeat
……
gather data in nextp;
wait(empty);
buffer:=nextp;
signal(full);
until false;
end
compute:
begin
repeat
……
wait(full);
nextc:=buffer;
signal(empty);
compute data in nextc;
until false;
end
29.画图说明管程由哪几部分组成,为什么要引入条件变量?
答:管程由四部分组成:①管程的名称;②局部于管程内部的共享数据结构说明;③对该数
据结构进行操作的一组过程;④对局部于管程内部的共享数据设置初始值的语句;

当一个进程调用了管程,在管程中时被阻塞或挂起,直到阻塞或挂起的原因解除,而在此期
间,如果该进程不释放管程,则其它进程无法进入管程,被迫长时间地等待。为了解决这个
问题,引入了条件变量condition。
30.如何利用管程来解决生产者与消费者问题?
答:首先建立一个管程,命名为ProclucerConsumer,包括两个过程:
(1)Put(item)过程。生产者利用该过程将自己生产的产品放到缓冲池,用整型变
量count 表示在缓冲池中已有的产品数目,当count≥n 时,表示缓冲池已满,生产者须
等待。
(2)get(item)过程。消费者利用该过程从缓冲池中取出一个产品,当count≤0
时,表示缓冲池中已无可取的产品,消费者应等待。
PC 管程可描述如下:
type procer-consumer =monitor
Var in,out,count:integer;
buffer:array[0,…,n-1]of item;
notfull,notempty:condition;
procere entry dot(item)
begin
if count>=n then not full.wait;
buffer(in):=nextp;
in:=(in+1)mod n;
count:=count+1;
if notempty.queue then notempty.signal;
end
procere entry get(item)
begin
if count<=0 then not full.wait;
nextc:=buffer(out);
out:=(out+1)mod n;
count:=count-1;
if notfull.quene then notfull.signal;
end
begin in:=out:=0;
count:=0
end
在利用管程解决生产者一消费者问题时,其中的生产者和消费者可描述为:
procer: begin
pepeat
proce an inem in nestp
PC.put(item);
until false;
end
consumer: begin
repeat
PC.get(item);
consume the item in enxtc;
until false;
end
31.什么是AND信号量?试利用AND信号量写出生产者一消费者问题的解法。
答:为解决并行带来的死锁问题,在wait 操作中引入AND 条件,其基本思想是将进
程在整个运行过程中所需要的所有临界资源,一次性地全部分配给进程,用完后一次性释放。
解决生产者-消费者问题可描述如下:
var mutex,empty,full: semaphore:=1,n,0;
buffer: array[0,...,n-1] of item;
in,out: integer:=0,0;
begin
parbegin
procer: begin
repeat

proce an item in nextp;

wait(empty);
wait(s1,s2,s3,...,sn); //s1,s2,...,sn为执行生产者进程除empty 外其余的条件
wait(mutex);
buffer(in):=nextp;
in:=(in+1) mod n;
signal(mutex);
signal(full);
signal(s1,s2,s3,...,sn);
until false;
end
consumer: begin
repeat
wait(full);
wait(k1,k2,k3,...,kn); //k1,k2,...,kn 为执行消费者进程除full 外其余的条件
wait(mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
signal(empty);
signal(k1,k2,k3,...,kn);
consume the item in nextc;
until false;
end
parend
end
32.什么是信号量集?试利用信号量集写出读者一写者问题的解法。
答:对AND信号量加以扩充,形成的信号量集合的读写机制。
解法:Var RN integer;
L,mx: semaphore:=RN,1;
begin
parbegin
reader:begin
repeat
Swait(L,1,1);
Swait(mx,1,1);

perform read operation;

Ssignal(L,1);
until false
end
writer:begin
repeat
Swait(mx,1,1;L,RN,0);
perform write operation;
Ssignal(mx,1);
until false
end
parend
end
33.试比较进程间的低级与高级通信工具。
答:用户用低级通信工具实现进程通信很不方便,效率低,通信对用户不透明,所有操作都
必须由程序员来实现,而高级通信工具弥补了这些缺陷,用户直接利用操作系统提供的一组
通信命令,高效地传送大量的数据。
34.当前有哪几种高级通信机制?
答:共享存储器系统、消息传递系统以及管道通信系统。
35.消息队列通信机制有哪几方面的功能?
答:(1)构成消息(2)发送消息(3)接收梢息(4)互斥与同步。
36.为什么要在OS 中引入线程?
答:在操作系统中引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具
有更好的并发性,提高CPU的利用率。进程是分配资源的基本单位,而线程则是系统调度的
基本单位。
37.试说明线程具有哪些属性?
答:(1)轻型实体(2)独立调度和分派的基本单位(3)可并发执行(4)共享进程资源。
38. 试从调度性,并发性,拥有资源及系统开销方面对进程和线程进行比较。
答:
(1)调度性。线程在OS 中作为调度和分派的基本单位,进程只作为资源拥有的基本单位。
(2)并发性。进程可以并发执行,一个进程的多个线程也可并发执行。
(3)拥有资源。进程始终是拥有资源的基本单位,线程只拥有运行时必不可少的资源,本
身基本不拥有系统资源,但可以访问隶属进程的资源。
(4)系统开销。操作系统在创建、撤消和切换进程时付出的开销显着大于线程。
39. 为了在多线程OS 中实现进程之间的同步与通信,通常提供了哪几种同步机制?
答:同步功能可以控制程序流并访问共享数据,从而并发执行多个线程。共有四种同步模型:
互斥锁、读写锁、条件变量和信号。
40.用于实现线程同步的私用信号量和公用信号量之间有何差别?
答:
(1)私用信号量。当某线程需利用信号量实现同一进程中各线程之间的同步时,可调用创
建信号量的命令来创建一个私用信号量,其数据结构存放在应用程序的地址空间中。
(2)公用信号量。公用信号量是为实现不同进程间或不同进程中各线程之间的同步而设置
的。其数据结构是存放在受保护的系统存储区中,由OS为它分配空间并进行管理。
41.何谓用户级线程和内核支持线程?
答:
(1)用户级线程:仅存在于用户空间中的线程,无须内核支持。这种线程的创建、撤销、
线程间的同步与通信等功能,都无需利用系统调用实现。用户级线程的切换通常发生在一个
应用进程的诸多线程之间,同样无需内核支持。
(2)内核支持线程:在内核支持下运行的线程。无论是用户进程中的线程,还是系统线程
中的线 程,其创建、撤销和切换等都是依靠内核,在内核空间中实现的。在内核空间里还
为每个内核支持线程设置了线程控制块,内核根据该控制块感知某线程的存在并实施控制。
42.试说明用户级线程的实现方法。
答:用户级线程是在用户空间中的实现的,运行在“运行时系统”与“内核控制线程”的中
间系统上。运行时系统用于管理和控制线程的函数的集合。内核控制线程或轻型进程LWP
可通过系统调用获得内核提供服务,利用LWP进程作为中间系统。
43.试说明内核支持线程的实现方法。
答:系统在创建新进程时,分配一个任务数据区PTDA,其中包括若干个线程控制块TCB
空间。创建一个线程分配一个TCB,有关信息写入TCB,为之分配必要的资源。当PTDA
中的TCB 用完,而进程又有新线程时,只要所创建的线程数目未超过系统允许值,系统可
在为之分配新的TCB;在撤销一个线程时,也应回收线程的所有资源和TCB。

7. 计算机专业学的是什么

装机,不需要理性思维的小儿科玩艺,有经验的非文盲就可以胜任。计算机专业毕业不知道声卡需要驱动,那是计算机的体系结构没有学好,不知道如何装双系统,如果看了说明书还不会,那是弱智,如果不看说明书就要人家会,那提这种要求的人是弱智。因为虽然操作系统的原理大同小异,但是每个系统的用户操作接口却自成体系。 条x翥�艈
国内由于作风浮躁,技术骗子横行(我曾有幸亲炙我国IT界巨象级专家教诲,结果是让我惶恐不堪,好不容易才憋住了笑),人人都想做管理技术双专家,而那些大学计算机的专家教授,大多是以前的学生会干部出身,钻营本领不小,实干能力(认真的理论研究和实际开发)却差得很。说到理论知识,其实大多也是一知半解,坑蒙拐骗,故作玄虚之论,其实也许关于状态机的数学原理和应用策略都没有搞清楚。 O澟汤崂h瑍
所以这个“理论知识”很强,要看是真的“很强”还是假的“很强”。如果真的搞复杂系统或者大型系统的软件开发,良好的理论涵养是必不可少的。例如,如果搞通讯协议软件的设计和开发,在国外,如果要确保项目成功,首先要对通讯协议的原语系统进行数学论证,以确保该系统的自洽性和非冗余性,以免对一套逻辑混乱的通讯协议投入大量的人力物力进行开发,最后在试运行时却才发现由于系统矛盾而导致失败(国外花的是资本家和有选举权的纳税人的钱,如果把钱砸进水里听不见响,那可是非同小可的事情。不象我们这里,花的是国家这个概念的钱)。比如,对于目前流行的TCP/IP协议,就有人进行数学论证,证明是一种比较完美的协议原语系统,只不过我国那些电信技术大师们不知道或者不愿意知道罢了,因为他们正以他们文学家、诗人和自称的民族主义和爱国主义分子的决心,在大干快上地开发拥有“自主知识产权”的通讯协议系统。据说最近华为被思科质称钞袭人家IOS操作系统。抄袭只是可鄙,不算耻辱,可是抄袭的时候连人家的Bug一起偷,就好比到人家家里偷夜壶的时候把尿一起端回了家,那就是民族的耻辱!这样急功近利做事方法还有一个更大的害处,那就是剥夺了真正苦干能干的理性的技术专家的发展机会,使我们的事业长期徘徊在谎言和剽窃的僵局中无法出头,长此以往,何谈创新? | .?e ?
比如,计算机理论课中的编译原理,在实际的应用开发中还是非常有用的。举例说:如果你要开发一套字处理软件系统,你就要为这套字处理软件系统的格式系统定义一套描述和标记符号,而读取和处理这套标记符号的算法,就是典型的编译算法,如果理论知识不强,那只能傻编。不过国内能理解应用LEX(FLEX)、BISON(YACC)的理论很强的朋友又有几位?另外,编译算法也是开发可配置的框架软件系统的必须技术。 ?阂清 �?
再比如,国内开发数据库系统相关软件,不论C-S模式还是多层模式,基本上不考虑同步和并行问题,把一切都丢给数据库或者中间件系统,但是这样的系统是非常低效率的,也是易错的。对于以面向对象编程方式开发的系统,并行和同步处理尤其是一项复杂的理论问题。这就是SUN公司的Java开发包SDK1.4至今除了synchronized(临界区机制)之外未能引入其他的类似于POSIX系统的同步和并发机制(例如读写锁、生产者-消费者等)的原因,因为针对面向对象系统的并发和同步机制的构造,还是一项认真的理论课题!(当然,你完全可以以过程编程方式来利用面向对象语言,从而将最初以c语言写的POSIX的同步和并行机制用JAVA语言翻译,但那样就不是一个纯的面向对象系统了,就会有种种潜在的副作用,破坏面向对象系统的Robust和可扩展型,降解系统的性能)。不过,Sun公司已经选择纽约的一位着名的大学教授在研究和开发JDK的同步和并发工具包,估计不久就要包含在JDK中。其中的一部分也已经引入。比如在JDK1.4中新引入的nio包中就包含了FileLock,基本上就是一种读写锁的机制。 E瞉o篂扡�
还有,关于面向对象编程,其实远不是继承,重用和《java与模式》这么简单(后面那本书的作者关于Java的涵养其实有待提高)。关于微软开发C#来替代C++,其实大有理论背景,那是因为目前的C++有着一种从面向对象系统的观点来看的一项重大的安全缺陷,只不过我国的主要技术精英终日沉湎于COM+或ADO,忙于拼凑交差系统而没有悟到而已。 邫x?黖E
所以,千万不要轻视理论知识,只不过要学会识别真的“理论知识”和伪的“理论知识”,这样才能使你不至于贻笑大方,妄自尊大。 页 2oI3exn
另外,信息技术其实内容广泛,分工细密,安装机器,实在是一种不需要多少思考的工作,也许根本不能算是一种技术,不会安装机器,就好比时装设计大师不会用缝纫机,不算什么。举个例子,计算机科学和工程界的泰斗级人物,荷兰的Dijkstra教授,至死只用钢笔作文,可是如果没有他发明的算法,就不会有现代的操作系统,也不会有现代主要的动态路由协议。所以你不能以你杀鱼杀得好为理由去鄙视烧鱼烧得好的同志。

8. 网络爬虫原理 c/c++用到线程池没

使用Synchronized关键字使当前线程取得对象TaskQueue的锁,并用wait和notifyAll函数进行线程间通信。
/* 任务队列类 */
public class TaskQueue
{
private Queue<url> taskbuffer;
private int taskcount;
private int maxN;

public TaskQueue(int max)
{
maxN = max;
taskbuffer = new Queue<url>(maxN);
taskcount = 0;
}

// 生产者调用的任务入队操作
public synchronized void addTask(List<url> urlList)
{
while(maxN <= taskcount)// 如果队列够大,while语句块可以略
{
wait(); // 进入TaskQueue对象等待池,释放锁
}
while(!urlList.isEmpty())
{
taskbuffer.add(str);
taskcount++;
}
notifyAll(); // 唤醒等待池线程
}

// 消费者调动的任务出队操作
public synchronized url getTask()
{
while(taskcount <= 0)
{
wait();
}
url str = taskbuffer.pop();
taskcount--;
return str;
}
}

/* 扮演生产者和消费者的网页抓取线程 */
public class WorkThread extends Thread
{
private TaskQueue taskQueue;
private List<url> urlList;

public WorkThread(TaskQueue tq)
{
taskQueue = tq;
urlList = new List<url>();
}

public List<url> crawl(url str)
{
/* crawl and parse the page str
* return the parse link list of page str
*/
}

public void run()
{
try {
while (true) {
Thread.sleep(1000);

url str = taskQueue.getTask(); // 扮演消费者
urlList = crawl(str); // 略去url去重,详见读写锁模式
tastQueue.addTask(urlList); // 扮演生成者
}
} catch (InterruptedException e) {
}
}
}

9. C语言中两个数值的判断是否会引起资源竞争(多线程)

是否竞争其实是取决于类型的
如果cpu可以一次性处理,那么不会,也就是int或者以下的没问题
如果是double的话就会有

10. c或者c++普通互斥锁怎么实现读写锁

如果是单线程 不需要上锁。
如果是多线程,那么在访问共享区域的时候(共享内存,或者全局变量),在每次读或者写之前,上锁。
在读写结束后,再解锁就可以了。