多線程編程c實例
A. 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
);
B. 鍏涓狢璇璦欏圭洰姣曚笟鍚庝粠灝忕櫧鍒板ぇ鐗
C璇璦8涓欏圭洰瀹炶返鐩村斾富棰
涓銆佸熀浜庣櫨搴AI鐨勮闊寵瘑鍒
闅懼害緋繪暟:
浠g爜閲:400琛
瀹炵幇鍔熻兘:璇闊沖綍鍏ャ佽闊寵漿鏂囧瓧
閫傚悎浜虹兢:鏈塁++銆丵T銆佺綉緇滃熀紜銆
娑夊強鎶鏈:QT銆佷俊鍙蜂笌妲姐丠TTP銆佺櫨搴AI寮鏀懼鉤鍙般
浜屻侀氳綆$悊緋葷粺
闅懼害緋繪暟:
浠g爜閲:400琛
瀹炵幇鍔熻兘:閫氳褰曚俊鎮鐨勫炲垹鏀規煡鎿嶄綔銆傞傚悎浜虹兢: C璇璦鐨勫垵瀛﹁咃紝闅懼害杈冨皬錛屼笉鍚堥傚啓鍦ㄧ畝鍘嗕笂銆傜患鍚堝簲鐢ㄦ暟緇勩佹寚閽堬紝鍙浠ラ敾鐐肩紪紼嬮昏緫鎬濈淮錛岀Н緔浠g爜閲忋
娑夊強鎶鏈:鏁扮粍銆佹寚閽堛佺粨鏋勪綋銆佸嚱鏁般
涓夈佸仠杞︾$悊緋葷粺
闅懼害緋繪暟:
浠g爜閲:800琛
瀹炵幇鍔熻兘:鍋滆濺銆佹壘杞︺佺即璐廣佺誨紑銆佽礬綰胯勫垝銆
閫傚悎浜虹兢:鏈塁璇璦鍜岄摼琛ㄣ佹爤銆侀槦鍒楀熀紜銆
娑夊強鎶鏈:鎸囬拡銆佹暟緇勩侀摼琛ㄣ侀槦鍒椼佸箍搴︿紭鍏堟悳緔銆
鍥涖佸熀鍗冪櫨搴AI鐨勫浘鍍忚瘑鍒
闅懼害緋繪暟:
浠g爜閲:800琛
瀹炵幇鍔熻兘:鍋滆濺銆佹壘杞︺佺即璐廣佺誨紑銆佽礬綰胯勫垝銆
閫傚悎浜虹兢:鏈塁璇璦鍜岄摼琛ㄣ佹爤銆侀槦鍒楀熀紜銆
娑夊強鎶鏈:鎸囬拡銆佹暟緇勩侀摼琛ㄣ侀槦鍒椼佸箍搴︿紭鍏堟悳緔銆
浜斻佹櫤鑳絎iFi鎽勫儚澶
闅懼害緋繪暟
浠g爜閲:1500琛
璇璦: C璇璦
瀹炵幇鍔熻兘:鍥懼儚鏁版嵁閲囬泦銆丄PP鏄劇ず銆佽繙紼嬫帶鍒墮傚悎浜虹兢:鏈塁璇璦銆丩inux銆佺綉緇滃熀紜錛屽睘浜庣患鍚堟ч」鐩錛岄傚悎鏈夋剰浠庝簨宓屽叆寮忓紑鍙戠殑鍚屽︺
紜浠跺鉤鍙:NanoPi Duo2
娑夊強鎶鏈: mjpg_stremer銆乯son銆乀CP銆乁DP銆丵T銆乪poll
鍏銆佹櫤鑳介煶綆
闅懼害緋繪暟:
浠g爜閲:3000琛
瀹炵幇鍔熻兘:鐢卞祵鍏ュ紡絝銆佸悗鍙頒簯鏈嶅姟鍣ㄥ拰APP緇勬垚錛屽疄鐜頒簡鍒囨瓕銆佹殏鍋溿佺戶緇銆侀煶閲忚皟鑺傘丄PP榪滅▼鎺у埗銆佽闊蟲帶鍒躲
閫傚悎浜虹兢:鏈塁/C++/Linux鍩虹錛岀患鍚堟ф瘮杈冨己錛屽彲浠
浣滀負欏圭洰鎻愬崌銆佹瘯璁俱佸氨涓氱瓑銆
紜浠跺鉤鍙;mini2440
娑夊強鎶鏈: C/C++銆乴ibevnet銆乯son銆佽繘紼嬨乀CP銆丵T
涓冦丱penCV鏅鴻兘灝忚濺
闅懼害緋繪暟:
浠g爜閲:1000琛
瀹炵幇鍔熻兘:杞﹁締鎺у埗銆佸畾閫熷貳鑸銆佹祴璺濄佽濺閬撴嫻嬩互鍙
杞﹂亾淇濇寔銆
閫傚悎浜虹兢:鏈塁璇璦鍜屽崟鐗囨満寮鍙戝熀紜銆
紜浠跺鉤鍙:51鍗曠墖鏈哄拰ARMCortexA寮鍙戝椾歡
娑夊強鎶鏈: C璇璦銆51鍗曠墖鏈恆佸浘鍍忓勭悊銆佷覆鍙i氫俊銆
鍏銆佽繙紼嬮氫俊杞浠
闅懼害緋繪暟: 浠g爜閲:3000琛
瀹炵幇鍔熻兘:娉ㄥ唽銆佺櫥褰曘佹坊鍔犲ソ鍙嬨佽亰澶┿佸緩緹ゃ佹枃浠朵紶杈撱
閫傚悎浜虹兢:鏈塁++銆佺綉緇滃熀紜銆
騫沖彴:瀹㈡埛絝疻indows銆佹湇鍔″櫒Linux銆
娑夊強鎶鏈: C++銆乴ibevent銆丵T銆佸氱嚎紼嬨丮ySQL銆佹枃浠
C. 什麼是多線程編程
多線程編程技術是java語言的重要特點。多線程編程的含義是將程序任務分成幾個並行的子任務。特別是在網路編程中,你會發現很多功能是可以並發執行的。 比如網路傳輸速度較慢、用戶輸入速度較慢,你可以用兩個獨立的線程去完成這兩個功能,而不影響正常的顯示或其它功能。 多線程是與單線程比較而言的,普通的Windows採用單線程程序結構,其工作原理是:主程序有一個消息循環,不斷從消息隊列中讀入消息來決定下一步所要乾的事情,一般是針對一個函數,只有等這個函數執行完之後,主程序才能接收另外的消息來執行。比如子函數功能是在讀一個網路數據,或讀一個文件,只有等讀完這個數據或文件才能接收下一個消息。在執行這個子函數過程中你什麼也不能幹。但往往讀網路數據和等待用戶輸入有很多時間處於等待狀態,多線程利用這個特點將任務分成多個並發任務後,就可以解決這個問題。Java中的線程類 1.擴展java.lang.Thread類,用它覆蓋Thread類的run方法。 2.生成實現java.lang.Runnable介面的類並將其它的實例與java.lang.Thread實例相關聯。 Thread類是負責向其它類提供線程支持的最主要的類,要使用一個類具有線程功能,在Java中只要簡單地從Thread類派生一個子類就可以了擴展Thread類,如printThread.java。 Thread類最重要的方法是run方法。run方法是新線程執行的方法,因此生成java.lang.Thread的子類時,必須有相應的run方法。 //PrintThread.java public class PrintThread extends Thread//繼承Tread類 private int count=0 //定義一個count變數用於統計列印的次數並共享變數 public static void mainString args//main方法開始 PrintThread p=new PrintThread//創建一個線程實例 p.start//執行線程 for{;;}//主線程main方法執行一個循環,for執行一個死循環count++ System.out.printcount+″:Main\n″//主線程中列印count +「main」變數的值,並換行 public void run//線程類必須有的run()方法for{;;}count++ System.out.printcount+″:Thread\n″ 上面這段程序便是繼承java.lang.Tread並覆蓋run的方法。用Java 虛擬機啟動程序時,這個程序會先生成一個線程並調用程序主類的main方法。這個程序中的main方法生成新線程,連接列印「Thread」。在啟動線程之後,主線程繼續列印「Main」。 編譯並執行這個程序,然後立即按「Ctrl+C」鍵中斷程序,你會看到上面所述的兩個線程不斷列印出:XXX:main…..XXX:Thread…. XXX代表的是數字,也就是上面count的值。在筆者的機器上,不同時刻這兩個線程列印的次數不一樣,先列印20個main(也就是先執行20次主線程)再列印出50次Thread,然後再列印main…… 提示:為了便於查看該程序的執行結果,你可以將執行結果導入一個文本文件,然後打開這個文件查看各線程執行的情況。如運行: javac PrintThread.java Java PrintThread1.txt 第一個命令javac PrintThread.java是編譯java程序,第二個是執行該程序並將結果導入1.txt文件。當然你可以直接執行命令:java
D. 關於C++多線程編程教學
在Windows NT和Windows 9x中,多線程的編程實現需要調用一系列的API函數,如CreateThread、ResumeThread等,比較麻煩而且容易出錯。我們使用Inprise公司的新一代RAD開發工具C++Builder,可以方便地實現多線程的編程。與老牌RAD工具Visual Basic和Delphi比,C++Builer不僅功能非常強大,而且它的編程語言是C++,對於系統開發語言是C的Windows系列操作系統,它具有其它編程語言無可比擬的優勢。利用C++Builder提供的TThread對象,多線程的編程變得非常簡便易用。那麼,如何實現呢?且待我慢慢道來,讓你體會一下多線程的強大功能。
1. 創建多線程程序:
首先,先介紹一下實現多線程的具體步驟。在C++Builder中雖然用Tthread對象說明了線程的概念,但是Tthread對象本身並不完整,需要在TThread下新建其子類,並重載Execute方法來使用線程對象。在C++Builder下可以很方便地實現這一點。
在C++Builder IDE環境下選擇菜單File|New,在New欄中選中Thread Object,按OK,接下來彈出輸入框,輸入TThread對象子類的名字MyThread,這樣C++Builder自動為你創建了一個名為TMyThread的TThread子類。同時編輯器中多了一個名為Unit2.cpp的單元,這就是我們創建的TMyThread子類的原碼,如下:
#include
#pragma hdrstop
#include 「Unit2.h」
#pragma package(smart_init)
//---------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall MyThread::UpdateCaption()
// {
// Form1->Caption = 「Updated in a thread」;
// }
//--------------------
__fastcall MyThread::MyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//--------------------
void __fastcall MyThread::Execute()
{
//---- Place thread code here ----
}
//---------------------
其中的Execute()函數就是我們要在線程中實現的任務的代碼所在處。在原代碼中包含Unit2.cpp,這個由我們創建的TMyThread對象就可以使用了。使用時,動態創建一個TMyThread 對象,在構造函數中使用Resume()方法,那麼程序中就增加了一個新的我們自己定義的線程TMyThread,具體執行的代碼就是Execute()方法重載的代碼。要載入更多的線程,沒關系,只要繼續創建需要數量的TMyThread 對象就成。
E. C語言基礎網路編程求助 如何實現多線程
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void*thread(void*);
int client[5],i;
main()
{
int serverSocket= socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_addr;
struct sockaddr_in clientAddr;
int addr_len = sizeof(clientAddr);
//線程
pthread_t id;
pthread_attr_t attr;
pthread_attr_init(&attr);////////////////////////////////////////////////
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
//創建地址
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_port = htons(5555);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//綁定
bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr));
listen(serverSocket,5);
for(i=0;i<5;i++)
{
client[i] = accept(serverSocket,(struct sockaddr *)&clientAddr,(socklen_t*)&addr_len);
pthread_create(&id,&attr,thread,(void *)&client[i]);/////////////////////////////////
pthread_join(id,NULL);
}
close(serverSocket);/////////////////////////
return 0;
}
void* thread(void* argv)
{
char buffer[200];
int a=i;
int s_c = *((int*)argv);///////////////////
while(1)
{
int n = recv(s_c,buffer,sizeof(buffer),0);
if(n > 0)
printf("客戶端發過來的 : %s\n",buffer);
else
return;
}
close(s_c);
}
F. 怎麼用c語言編程 實現創建原語、撤銷原語、阻塞原語和喚醒原語
下,應該差不多
一、如何建立線程
用到的頭文件
(a)pthread.h
(b)semaphore.h
(c) stdio.h
(d)string.h
定義線程標識
pthread_t
創建線程
pthread_create
對應了一個函數作為線程的程序段
注意的問題
要保證進程不結束(在創建線程後加死循環)
在線程中加入While(1)語句,也就是死循環,保證進程不結束。
二、控制線程並發的函數
sem_t:信號量的類型
sem_init:初始化信號量
sem_wait:相當於P操作
sem_post:相當於V操作
三、實現原形系統
父親、母親、兒子和女兒的題目:
桌上有一隻盤子,每次只能放入一隻水果。爸爸專放蘋果,媽媽專放橘子,一個兒子專等吃盤子中的橘子,一個女兒專等吃盤子中的蘋果。分別用P,V操作和管程實現
每個對應一個線程
pthread_t father; father進程
pthread_t mother; mother進程
pthread_t son; son進程
pthread_t daughter; daughter進程
盤子可以用一個變數表示
sem_t empty;
各線程不是只做一次,可以是無限或有限次循環
用While(1)控制各線程無限次循環
輸出每次是那個線程執行的信息
printf("%s\n",(char *)arg);通過參數arg輸出對應線程執行信息
編譯方法
gcc hex.c -lpthread
生成默認的可執行文件a.out
輸入./a.out命令運行
查看結果:程序連續運行顯示出
father input an apple.
daughter get an apple.
mother input an orange.
son get an orange.
mother input an orange.
son get an orange.
………………..
四、程序源代碼
#include <stdio.h>
#include<string.h>
#include <semaphore.h>
#include <pthread.h>
sem_t empty; //定義信號量
sem_t applefull;
sem_t orangefull;
void *procf(void *arg) //father線程
{
while(1){
sem_wait(&empty); //P操作
printf("%s\n",(char *)arg);
sem_post(&applefull); //V操作
sleep(7);
}
}
void *procm(void *arg) //mother線程
{
while(1){
sem_wait(&empty);
printf("%s\n",(char *)arg);
sem_post(&orangefull);
sleep(3);
}
}
void *procs(void *arg) //son線程
{
while(1){
sem_wait(&orangefull);
printf("%s\n",(char *)arg);
sem_post(&empty);
sleep(2);
}
}
void *procd(void *arg) //daughter線程
{
while(1){
sem_wait(&applefull);
printf("%s\n",(char *)arg);
sem_post(&empty);
sleep(5);
}
}
main()
{
pthread_t father; //定義線程
pthread_t mother;
pthread_t son;
pthread_t daughter;
sem_init(&empty, 0, 1); //信號量初始化
sem_init(&applefull, 0, 0);
sem_init(&orangefull, 0, 0);
pthread_create(&father,NULL,procf,"father input an apple."); //創建線程
pthread_create(&mother,NULL,procm,"mother input an orange.");
pthread_create(&daughter,NULL,procd,"daughter get an apple.");
pthread_create(&son,NULL,procs,"son get an orange.");
while(1){} //循環等待
}
另外,站長團上有產品團購,便宜有保證