當前位置:首頁 » 編程語言 » c語言如何使用多線程
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言如何使用多線程

發布時間: 2023-05-06 08:12:58

Ⅰ 多線程怎麼用

如何實現多線程
兩種方式:

繼承Thread類,重寫run方法

實現Runnable介面,實現run方法。

啟動線程調用線程的start方法。

如何用多線程來處理一個問題?
每個線程只完成一個數的累積和,(用線程的參數來傳遞指定的數),不要把數組裡面的所有數都進行計算。

你可以傳給線程的時候,除了傳遞輸入輸出數組以外租正讓,再傳遞一個index。線程中只處理這個index位置上的數就可以了。
Java線程怎樣使用?
Thread線程類,該類有一個共有的無返回值不帶參數的run方法。

可以用子類繼承Thread類然後重寫run方法。

class T extends Thread{public void run(){while(true){System.out.println("xx"); } 范 }使用是聲明改自定義類對象,調用start方法啟動線程。

Thread t=new T();t.strat();線程啟動執行類中run方法中預制的代碼。

也可以通過實現線程介面Runnable來創建線程

Thread t=new Thread(new Runnable{public void run(){代碼 }});t.start();
多線程有幾種實現方法
線程建立/執行:

HANDLE Handle1;

DWORD ID1;

Handle1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&ID1);

線程等待:

WaitForSingleObject(Handle1,INFINITE);

線程同步---生產者消費者:

HANDLE m_S_Consumer;

m_S_Consumer = CreateSemaphore(NULL,0,20, NULL);創建,最多允許有20個產品等待使用,初始0個

ReleaseSemaphore(m_S_Consumer,1,NULL);生產1個

if(WaitForSingleObject(m_S_Consumer,INFINITE) == WAIT_OBJECT_0){消費1個

......

}
如何使用線程
java平台從開始就被設計成為多線程環境。在你的主程序執行的時候,其它作業如碎片收集和事件處理則是在後台進行的。本質上,你可以認為這些作業是線程。它們正好是系統治理線程,但是無論如何,它們是線程弊局。線程使你能夠定義相互獨立的作業,彼此之間互不幹擾。系統將交換這些作業進或出CPU,這樣(從外部看來)它們好象是同時運行的。 在你需要在你的程序中處理多個作業時,你也可以使用多個進程。這些進程可以是你自己創建的,你也可以操縱系統線程。 你進行這些多作業處理,要使用幾個不同的類或介面: java.util.Timer類

javax.swing.Timer類Thread類Runnable介面 對於簡單的作業,通常需要重復的,你可以使用java.util.Timer類告訴它「每半秒鍾做一次」。清改注重:大多數系統常式是使用毫秒的。半秒鍾是500毫秒。 你希望Timer實現的任務是在java.util.TimerTask實例中定義的,其中運行的方法包含要執行的任務。這些在Hi類中進行了演示,其中字元串「Hi」重復地被顯示在屏幕上,直到你按Enter鍵。 import java.util.*;

public class Hi {

public static void main(String args[])

throws java.io.IOException {

TimerTask task = new TimerTask() {

public void run() {

System.out.PRintln("Hi");}};Timer timer = new Timer();

timer.schele(task, 0, 500);

System.out.println("Press ENTER to stop");

System.in.read(new byte[10]);

timer.cancel();}} Java Runtime Environment工作的方式是只要有一個線程在運行,程序就不退出。這樣,當取消被調用,沒有其它線程在運行了,則程序退出。有一些系統線程在運行,如碎片收集程序。這些系統線程也被稱為後台線程。後台線程的存在不影響運行環境被關閉,只有非後台線程保證運行環境不被關閉。 Javax.swing.Timer類與java.util.timer類的工作方式相似,但是有一些差別需要注重。第一,運行的作業被ActionListener介面的實現來定義。第二,作業的執行是在事件處理線程內部進行的,而不象java.util.Timer類是在它的外部。這是很重要的,因為它關繫到Swing組件集是如何設計的。 假如你不熟悉Swing,它是一組可以被Java程序使用的圖形組件。Swing被設計程被稱為單線程的。這意味著對Swing類內部內容的訪問必須在單個線程中完成。這個特定的線程是事件處理線程。這樣,例如你想改變Label組件的文字,你不能僅僅調用Jlabel的setText方法。相反,你必須確認setText調用發生在事件處理線程中,而這正是javax.swing.Time類派的上用場的地方。 為了說明這第二種情況,下面的程序顯示一個增加的計數器的值。美半秒鍾計數器的數值增加,並且新的數值被顯示。
c語言如何實現多線程同時運行
使用pthread庫執行多線程,這個是Linux下的線程庫 Windows下應該有自己的API,不過這種東西一般還是以Linux為標准。pthread_create()創建一個線程,傳入fun()的函數指針就行了。

然後這個Beep()的需求要進行線程間通信,可以用共享內存的方法,設一個bool變數flag共享,然後beep的時候設為false,beep完設成true。fun()裡面每次看一下這個flag,是false的話就不做動作等下一秒,基本可以滿足需求。

這樣做的好處是實現簡單,但時間是以1s為單位的。如果要8秒結束立刻執行,需要用條件變數的方法來控制,比較復雜,這樣的實現方式一個可以滿足需求了。
如何在for循環中使用多線程
乾脆把 i 當做參數傳入好了

class Program

{

static int i;

static void Main(string[] args)

{

i = 0;

do

{

new Thread(new ParameterizedThreadStart(s)).Start(i);

i++;

} while (i < 10);

Console.Read();

}

static private void s(object index)

{

Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "," + (int)index);

}

}
如何增加多線程的穩定性
微軟官方給出的方案在MSDN裡面有說,就是使用ActiveX EXE那種"單元線程模型".

我也曾經試過,的確可以實現"多線程",只是由於要多一個EXE,比較麻煩,後來就沒有深入了.

結果一次無意中在VBGOOD中看到一段代碼,才打通了一個關節:為什麼不直接使用ActiveX EXE寫程序呢?!

那段代碼裡面,是直接使用這種工程類型,然後在工程內使用CreateObject來生成一個新對象,這樣的話,新的對象就工作於一個單元線程內了.

其實這個我也知道,可是就沒有想到在ActiveX EXE內部使用

看來思路真的不如人.....還要多多學習,多多積累.

ActiveX EXE工程設置為"獨立啟動"後,貌似只能從Sub Main里進行初始化.

而每個對象的建立,都會調用一次這個過程,因此這個過程需要一次性運行.

但是MSDN里說得很清楚,在單元線程模型裡面,全局變數的范圍只能是本單元,因此不能使用設置全局變數來完成這個過程的一次運行邏輯.

原代碼里使用了GetProp等方式,感覺不是很好,於是作了一下改進,使用事件對象來完成此工作.

Sub Main相關代碼如下:

Private Const MyEvent As String = "m5home"

Dim hEvent As Long

Sub Main()

If GetEventHandle = 0 Then '由於每個新對象的建立,都要執行Main()過程,因此使用事件對象來進行判斷.

hEvent = CreateEvent(0&, False, False, MyEvent) '在單元線程下,模塊里的全局變數已經沒有用了.frmMain.Show

End If

End Sub

Private Function GetEventHandle() As Long

GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)

Call CloseHandle(GetEventHandle)

End Function

Public Function Quit()

Call CloseHandle(hEvent)

End Function

Private Const MyEvent As String = "m5home"

Dim hEvent As Long

Sub Main() If GetEventHandle = 0 Then '由於每個新對象的建立,都要執行Main()過程,因此使用事件對象來進行判斷.

hEvent = CreateEvent(0&, False, False, MyEvent) '在單元線程下,模塊里的全局變數已經沒有用了.frmMain.Show

End If

End Sub

Private Function GetEventHandle() As Long GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)

Call CloseHandle(GetEventHandle)

End Function

Public Function Quit()

Call CloseHandle(hEvent)

End Function

由於事件對象是系統范圍的,因此可......>>
怎樣用純C寫一個多線程的程序
這是我以前寫的一個多線程範例,湊合看看吧:

#include

#include

#include

using namespace std;

提示計程車到達的條件變數

pthread_cond_t taxiCond;

同步鎖

pthread_mutex_t taxiMutex;

旅客到達等待計程車

void * traveler_arrive(void * name)

{

cout<< " Traveler: " <<(char *)name<< " needs a taxi now! " <

pthread_mutex_lock(&taxiMutex);

pthread_cond_wait (&taxiCond, &taxiMutex);

pthread_mutex_unlock (&taxiMutex);

cout<< " Traveler: " << (char *)name << " now got a taxi! " <

pthread_exit( (void *)0 );

}

計程車到達

void * taxi_arrive(void *name)

{

cout<< " Taxi " <<(char *)name<< " arrives. " <

pthread_cond_signal(&taxiCond);

pthread_exit( (void *)0 );

}

int main()

{

pthread_t thread;

pthread_attr_t threadAttr;

pthread_attr_init(&threadAttr);

pthread_create(&thread, & threadAttr, taxi_arrive, (void *)( " Jack " ));

sleep(1);

pthread_create(&thread, &threadAttr, traveler_arrive, (void *)( " Susan " ));

sleep(1);

pthread_create(&thread, &threadAttr, taxi_arrive, (void *)( " Mike " ));

sleep(1);

return 0;

}...>>
線程是什麼,什麼時候使用線程,如何使用線程?
如果用書面語,那你還不如看書呵,還是通俗點。

線程:

舉例:如果你開著QQ,需要和多人進行語音,那麼,你邀請一位朋友進行連接,就需要開辟一條線程,用於保持連接和傳遞數據。它和進程不同,具體的內容可以網路下:線程和進程的區別。

使用:

一般會在同時觸發多項任務時使用線程,比如伺服器和客戶端的連接,作為伺服器,我需要接受多個客戶端的訪問,每個客戶端的操作又都不一樣,但都需要伺服器去處理,那麼作為伺服器我會創建專屬於該客戶端的一個連接(一個線程去hold住它),通過互相傳遞指令去執行任務。

創建:

有2種方法:

推薦用:

public class TestRun implements Runnable{ 第一步實現Runnable介面

public TestRun(){

new Thread(this).start(); 第三步啟動線程

}

public void run(){ 第二步實現run方法,該方法為介面中抽象方法

System.out.println("線程體");

}

}

Ⅱ C語言怎樣實現多線程

packagecn.sdeit.file;
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.InputStream;
import歷讓java.io.InputStreamReader;
importjava.util.Scanner;
publicclassReadTxt
{
privateintid;
publicStringgetArticle(Stringpath,intid)
{
Stringurl=path+id+".txt";
Stringstring="";
StringallString="";
Filefile=newFile(url);
try
{
BufferedReaderreader=newBufferedReader(newInputStreamReader(newFileInputStream(file),"utf-8"並搭));
while((string=reader.readLine())!=null)
{
allString+=絕爛拿string+" ";
}
}catch(FileNotFoundExceptione)
{
e.printStackTrace();
}catch(IOExceptione)
{
e.printStackTrace();
}
returnallString;
}
}

Ⅲ C語言多線程如何實現

線程之間沒有共享數據,不需要線程同步
你在主函數裡面,把線程銷毀的太快了,線程都沒來得及執行完你就退出了,在創建完線程之後,加個sleep等待幾秒再銷毀線程。
同時注意一下,主進程退出的話,所有線程也會退出。

如果要准確的等待線程執行完再銷毀,可以使用join方法或者共享標志位的方法

Ⅳ C語言能實現多線程么

可以通過調用C語言函數庫pthread里的函數,創建多線程。

多線程是指程序中包含多個執行流,即在一個程序中可以同時運行棚悉多個不同的線程來執行不同的任務,也就是說允許單個程序創建多個並行執行的線程來完成各自的任務。

C語言最初並未設鏈肢乎計多線程的機制,隨著飢棚軟硬體的發展及需求的發展,C語言才開發了線程庫以支持多線程的操作和應用。

Ⅳ c語言中怎樣創建多線程

/*這是我寫的最簡單的多線程程序,看懂不?*/
#include <windows.h>
#include <stdio.h>
//#include <strsafe.h>

DWORD WINAPI ThreadProc1( LPVOID lpParam )
{

int i=0,j=0;
while(1)
{
printf("hello,this thread 1 ...\n");

//延時
for(i=0;i<200000000;i++)
{
;
}
}
}

DWORD WINAPI ThreadProc2( LPVOID lpParam )
{

int i=0,j=0;
while(1)
{
printf("hello,this thread 2 ...\n");

//延時
for(i=0;i<200000000;i++)
{
;
}
}
}

void main()
{
int i=0;
//創建線程1
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc1, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier

//創建線程2
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc2, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier

//讓主線程進入循環,主線程若退出,子線程1,2會被系統「殺死」
while(1)
{
printf("hello,this thread 0 ...\n");

//延時
for(i=0;i<200000000;i++)
{;}

}
}

Ⅵ c語言如何編寫一個簡單的多線程程序

這是一個多線程例子,裡面只有兩個線程,是生產者/消費者模式,已編譯通毀舉宏過,注釋很詳細,x0dx0a如下:x0dx0ax0dx0a/* 以生答蠢產者和消費者模型問題來闡述Linux線程的控制和通信你 x0dx0a 生產者線程將生產的產品送入緩沖區,消費者線程則從中取出產品。x0dx0a 緩沖區有N個,是一個環形的緩沖池。x0dx0a */纖冊x0dx0a#include x0dx0a#include x0dx0ax0dx0a#define BUFFER_SIZE 16x0dx0ax0dx0astruct prodconsx0dx0a{x0dx0a int buffer[BUFFER_SIZE];/*實際存放數據的數組*/x0dx0a pthread_mutex_t lock;/*互斥體lock,用於對緩沖區的互斥操作*/x0dx0a int readpos,writepos; /*讀寫指針*/x0dx0a pthread_cond_t notempty;/*緩沖區非空的條件變數*/x0dx0a pthread_cond_t notfull;/*緩沖區未滿 的條件變數*/x0dx0a};x0dx0ax0dx0a/*初始化緩沖區*/x0dx0avoid pthread_init( struct prodcons *p)x0dx0a{x0dx0a pthread_mutex_init(&p->lock,NULL);x0dx0a pthread_cond_init(&p->notempty,NULL);x0dx0a pthread_cond_init(&p->notfull,NULL);x0dx0a p->readpos = 0;x0dx0a p->writepos = 0;x0dx0a}x0dx0ax0dx0a/*將產品放入緩沖區,這里是存入一個整數*/x0dx0avoid put(struct prodcons *p,int data)x0dx0a{x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待緩沖區未滿*/x0dx0a if((p->writepos +1)%BUFFER_SIZE ==p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notfull,&p->lock);x0dx0a }x0dx0a p->buffer[p->writepos] =data;x0dx0a p->writepos++;x0dx0a if(p->writepos >= BUFFER_SIZE)x0dx0a p->writepos = 0;x0dx0a pthread_cond_signal(&p->notempty);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a}x0dx0a/*從緩沖區取出整數*/x0dx0aint get(struct prodcons *p)x0dx0a{x0dx0a int data;x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待緩沖區非空*/x0dx0a if(p->writepos == p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notempty ,&p->lock);//非空就設置條件變數notemptyx0dx0a }x0dx0a /*讀書據,移動讀指針*/x0dx0a data = p->buffer[p->readpos];x0dx0a p->readpos++;x0dx0a if(p->readpos == BUFFER_SIZE)x0dx0a p->readpos = 0;x0dx0a /*設置緩沖區未滿的條件變數*/x0dx0a pthread_cond_signal(&p->notfull);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a return data;x0dx0a}x0dx0a /*測試:生產站線程將1 到1000的整數送入緩沖區,消費者線程從緩沖區中獲取整數,兩者都列印信息*/x0dx0a#define OVER (-1)x0dx0astruct prodcons buffer;x0dx0avoid *procer(void *data)x0dx0a{x0dx0a int n;x0dx0a for( n=0;n<1000;n++)x0dx0a {x0dx0a printf("%d ------>\n",n);x0dx0a put(&buffer,n);x0dx0a }x0dx0a put(&buffer,OVER);x0dx0a return NULL;x0dx0a}x0dx0avoid *consumer(void *data)x0dx0a{x0dx0a int d;x0dx0a while(1)x0dx0a {x0dx0a d = get(&buffer);x0dx0a if(d == OVER)x0dx0a break;x0dx0a elsex0dx0a printf("----->%d\n",d);x0dx0a }x0dx0a return NULL;x0dx0a}x0dx0aint main()x0dx0a{x0dx0a pthread_t th_p,th_c;x0dx0a void *retval;x0dx0a pthread_init(&buffer);x0dx0a pthread_create(&th_p,NULL,procer,0);x0dx0a pthread_create(&th_c,NULL,consumer,0);x0dx0a /*等待兩個線程結束*/x0dx0a pthread_join(th_p, &retval);x0dx0a pthread_join(th_c,&retval);x0dx0a return 0;x0dx0a}

Ⅶ C語言編的程序如何實現多線程運行

unix或linux下可以包含pthread.h頭文陵雹告件
使用pthread_create 函數來創建一個尺明線程
int pthread_create (pthread_t *, const pthread_attr_t *,
void *(*)(void *), void *);

windows下也有windows api可以實現肆仔

Ⅷ C語言多線程的操作步驟

線程創建
函數原型:intpthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
返回值:若是成功建立線程返回0,否則返回錯誤的編號。
形式參數:pthread_t*restrict tidp要創建的線程的線程id指針;const pthread_attr_t *restrict attr創建線程時的線程屬性;void *(start_rtn)(void)返回值是void類型的指針函數;void *restrict arg start_rtn的形參。
線程掛起:該函數的作用使得當前線程掛起,等待另一個線程返回才繼續執行。也就是說當程序運行到這個地方時,程序會先停止,然後等線程id為thread的這個線程返回,然後程序才會斷續執行。
函數原型:intpthread_join(pthread_tthread, void **value_ptr);
參數說明如下:thread等待退出線程的線程號;value_ptr退出線程的返回值。
返回值:若成功,則返回0;若失敗,則返回錯誤號。
線程退出
函數原型:voidpthread_exit(void *rval_ptr);
獲取當前線程id
函數原型:pthread_tpthread_self(void);
互斥鎖
創建pthread_mutex_init;銷毀pthread_mutex_destroy;加鎖pthread_mutex_lock;解鎖pthread_mutex_unlock。
條件鎖
創建pthread_cond_init;銷毀pthread_cond_destroy;觸發pthread_cond_signal;廣播pthread_cond_broadcast;等待pthread_cond_wait。

Ⅸ C語言怎樣實現多線程

首先你要有控制蛇移動方向的全局變數(定義在main以外因為線程函數也要調用它,每次鍵盤輸入都會修改它的值), 比如 char direction 'a' ==左 'w' == 右 'd'==上 's' == 下,然後你在移動時應該是在while裡面操作的吧,你每移動一步前都讀一下direction這個變數的數值然後再控制移動方向(注意s這個鍵可以忽略因為不會倒著走) 然後你可以用pthread.h這個庫 例子是 pthread t;// 定義一個線程 pthread_create(&t, null, listen_keyboard_input, null);//建立線程執行listen_keyboard_input這個函數 這個線程執行的函數 void listen_keyboard_input(){ while(應該通過某個信號來退出這個循環,從而表示游戲結束){ direction =getchar(); } } 但是這里存在同步問題, 比如當這個線程的getchar()在給direction輔助的同時,你控制貪吃蛇移動的線程正在調用 direction的值來判斷下一個移動方向,這就會出問題,所以要加一個鎖,叫 mutex lock;這個也定義成全局變數可以使各線程共享。 pthread_mutex_t mutex; //定義一個鎖 pthread_mutex_init(&mutex, null, null);//初始化 然後把函數修改成 void listen_keyboard_input(){ while(應該通過某個信號來退出這個循環,從而表示游戲結束){ pthread_mutex_lock(&mutex); direction =getchar(); pthread_mutex_unlock(&mutex); } } 另外一個控制貪吃蛇移動的時候也要加鎖 while(.....){ char c; pthread_mutex_lock(&mutex); c = direction; pthread_mutex_unlock(&mutex); switch(c){ ................ } ................................... } 這樣就好了 注意你的控制貪吃蛇移動的部分也必須要放在另外一個pthread 裡面執行,如果放在主線程, 主線程會一直等listen_keyboard_input而什麼事都不會做 你把這兩個線程用 pthread_create 創建完成後 用 t1.join(); t2.join(); 就可以使這兩個線程並發執行了 如果你用的是linux 來編譯的,你再輸入gcc 指令後加上 -lpthread 就可以了 還有什麼不懂的你可以多找找 pthread 類的例子

Ⅹ c語言中怎樣創建多線程

/*這是我寫的最簡單的多線程程序,看懂喚螞不?*/x0dx0a#include x0dx0a#include x0dx0a//#include x0dx0ax0dx0aDWORD WINAPI ThreadProc1( LPVOID lpParam ) x0dx0a{x0dx0ax0dx0a int i=0,j=0;x0dx0a while(1)x0dx0a {x0dx0a printf("hello,this thread 1 ...\n");x0dx0a x0dx0a //延時x0dx0a for(i=0;i<200000000;i++)x0dx0a {x0dx0a ;x0dx0a }x0dx0a }x0dx0a} x0dx0ax0dx0aDWORD WINAPI ThreadProc2( LPVOID lpParam ) x0dx0a{x0dx0ax0dx0a int i=0,j=0;x0dx0a while(1)x0dx0a {x0dx0a printf("hello,this thread 2 ...\n");x0dx0a x0dx0a //延時x0dx0a for(i=0;i<200000000;i++)x0dx0a {x0dx0a ;x0dx0a }x0dx0a }x0dx0a} x0dx0ax0dx0avoid main()x0dx0a{x0dx0a int i=0;x0dx0a //創建線程1x0dx0a CreateThread( x0dx0a NULL, /悄派/ default security attributesx0dx0a 0, // use default stack size x0dx0a ThreadProc1, // thread function x0dx0a NULL, // argument to thread function x0dx0a 0, // use default creation flags x0dx0a NULL); // returns the thread identifier x0dx0ax0dx0a //創建線程2x0dx0a CreateThread( x0dx0a NULL, // default security attributesx0dx0a 0, // use default stack size x0dx0a ThreadProc2, // thread function x0dx0a NULL, /和運埋/ argument to thread function x0dx0a 0, // use default creation flags x0dx0a NULL); // returns the thread identifierx0dx0ax0dx0a //讓主線程進入循環,主線程若退出,子線程1,2會被系統「殺死」x0dx0a while(1)x0dx0a {x0dx0a printf("hello,this thread 0 ...\n");x0dx0a x0dx0a //延時x0dx0a for(i=0;i<200000000;i++)x0dx0a {;}x0dx0ax0dx0a }x0dx0a}