要實(shí)現(xiàn)完全的并發(fā)執(zhí)行,在一個(gè)CPU下實(shí)際上是不可能的
創(chuàng)新互聯(lián)堅(jiān)實(shí)的技術(shù)研發(fā)基礎(chǔ)贏得了行業(yè)內(nèi)的良好口碑,公司成立十余年來(lái),為千余家企業(yè)提供過(guò)網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、搜索引擎優(yōu)化技術(shù)、互聯(lián)網(wǎng)大數(shù)據(jù)整合營(yíng)銷(xiāo)服務(wù),多年的技術(shù)服務(wù)成功經(jīng)驗(yàn)、眾多的客戶使我們能懂得更多,做得更好。"讓您的網(wǎng)站跑起來(lái)"是我們一直追求的目標(biāo)!
所說(shuō)的并發(fā),都是在同一個(gè)時(shí)間段內(nèi)
多個(gè)任務(wù)開(kāi)始,交替占用CPU,最終結(jié)束。
也就是前一個(gè)任務(wù)還沒(méi)結(jié)束,后一個(gè)任務(wù)就開(kāi)始了,一種并發(fā)的形式而已。
所以 要么使用多線程
要么 手動(dòng)模擬這種多線程。
前者更常用。
c語(yǔ)言中一個(gè)完整的函數(shù)由函數(shù)首部和函數(shù)體構(gòu)成,而且定義函數(shù)時(shí)兩者都是必不可少的。
函數(shù)定義的一般形式如下:
類型標(biāo)識(shí)符
函數(shù)名(形參表列)
//
這是函數(shù)首部
//
以下{
}內(nèi)的是函數(shù)體
{
說(shuō)明部分
執(zhí)行部分
}
舉例說(shuō)明如下:
//
定義一個(gè)不帶返回值的函數(shù)
//
函數(shù)功能:輸出形參的值
void
fun(int
a,
int
b)
{
printf("%d,
%d\n",
a,
b);
}
//
定義一個(gè)帶返回值的函數(shù)
//
函數(shù)功能:返回2個(gè)整數(shù)數(shù)的最大值
int
fun(int
a,
int
b)
{
return
ab
?
a
:
b;
}
這是一個(gè)操作系統(tǒng)中進(jìn)程同步典型的消費(fèi)者-生產(chǎn)者問(wèn)題,一般的解法就是按照你這樣來(lái)做,給緩沖區(qū)上鎖,寫(xiě)操作完成或者讀操作完成以后就解鎖,這種問(wèn)題涉及線程間的通訊,只能夠通過(guò)兩個(gè)線程的交互來(lái)實(shí)現(xiàn)通訊,目前你看起來(lái)復(fù)雜,但是用得多了,也就不復(fù)雜了。線程1“通知”線程2,或者線程2“通知”線程1,其實(shí)要利用信號(hào)量機(jī)制,需要調(diào)用wait()與signal()函數(shù),除此之外,還可以利用管程機(jī)制來(lái)實(shí)現(xiàn)線程之間的通訊,深入理解的話建議看看操作系統(tǒng)有關(guān)進(jìn)程同步的教材。
到底是什么意思呢?
像這樣嗎?
struct
SLIST
a,b,c,*p;
a.data='a';
b.data='b';
c.data='c';
p=a;
a.next=b;
b.next=c;
c.next='\0';
if(p==‘\0’)//這樣應(yīng)該是0而不是O
printf(“Linklist
is
null!\n”);/*鏈表為空(只有頭結(jié)點(diǎn))*/
else
/*鏈表非空*/
{
printf(“head”);
do
{printf(“-%d”,p-data);/*輸出當(dāng)前結(jié)點(diǎn)數(shù)據(jù)域中的值*/
p=p-next; /*p指向下一個(gè)結(jié)點(diǎn)*/
}
while(p!=‘\0’); /*未到鏈表尾,繼續(xù)循環(huán)*/
printf(“-end\n”);
同時(shí)執(zhí)行,使用線程了
C語(yǔ)言本身沒(méi)有提供線程的功能,只能調(diào)用平臺(tái)的線程來(lái)實(shí)現(xiàn)
如果在 WINDOWS 下面,可以參考一下 CreateThread 方法
在Win32程序中,可以使用多線程來(lái)實(shí)現(xiàn),但是那個(gè)比較復(fù)雜,不太容易在短時(shí)間內(nèi)掌握。