c語言線程項目,c++多線程項目

本文目錄一覽:

C語言怎麼寫線程代碼

通常使用CreateThread函數來創建新的線程.(Unix下使用pthread_create函數)

首先指出,線程與線程之間,是並列關係,不會存在”父子線程”的概念.

在Windows平台下,CreateThread函數包含在 Windows.h 文件內,包含此文件即可正常使用.

以下為CreateThread函數的聲明:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,//指向安全性屬性描述結構體的

//指針,通常可以忽略的.

SIZE_T dwStackSize,//指定新線程初始的棧大小,若不關心,可以用0填充,來要求使用

//默認值

LPTHREAD_START_ROUTINE lpStartAddress,//用來充當線程的函數的指針.

LPVOID lpParameter,//要傳遞給函數的參數,這個值本身就是那個參數,而不是參數的地址

DWORD dwCreationFlags,//創建的方式,0表示正常,創建後立即開始運行

LPDWORD lpThreadId//用來接受函數反饋的線程ID的指針.

);

用來充當新的線程的函數格式:

DWORD WINAPI ThreadProc(LPVOID);

CreateThread函數若成功了,返回新線程的句柄,若失敗了,則返回NULL.

若用CREATE_SUSPENDED填充dwCreation Flags則創建的線程先掛起來,並不直接開始運行,要用ResumeThread函數恢複線程,才能繼續運行.

c語言怎麼創建線程和使用

用 pthread_t創建線程名字。然後pthread_create開闢線程。

具體使用。

比如有一個函數

void *hello()

{

printf(“create pthread!\n”);

}

,然後在main函數裡面調用,

int main()

{

pthread_t a_thread;

pthread_create(a_thread, NULL, (void *)hello, NULL);

}

這樣就完成了hello()函數的創建和使用,接下來hello函數就會在一個線程中運行

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

這是一個多線程例子,裡面只有兩個線程,是生產者/消費者模式,已編譯通過,注釋很詳細,

如下:

/* 以生產者和消費者模型問題來闡述Linux線程的控制和通信你

生產者線程將生產的產品送入緩衝區,消費者線程則從中取出產品。

緩衝區有N個,是一個環形的緩衝池。

*/

#include stdio.h

#include pthread.h

#define BUFFER_SIZE 16

struct prodcons

{

int buffer[BUFFER_SIZE];/*實際存放數據的數組*/

pthread_mutex_t lock;/*互斥體lock,用於對緩衝區的互斥操作*/

int readpos,writepos; /*讀寫指針*/

pthread_cond_t notempty;/*緩衝區非空的條件變數*/

pthread_cond_t notfull;/*緩衝區未滿 的條件變數*/

};

/*初始化緩衝區*/

void pthread_init( struct prodcons *p)

{

pthread_mutex_init(p-lock,NULL);

pthread_cond_init(p-notempty,NULL);

pthread_cond_init(p-notfull,NULL);

p-readpos = 0;

p-writepos = 0;

}

/*將產品放入緩衝區,這裡是存入一個整數*/

void put(struct prodcons *p,int data)

{

pthread_mutex_lock(p-lock);

/*等待緩衝區未滿*/

if((p-writepos +1)%BUFFER_SIZE ==p-readpos)

{

pthread_cond_wait(p-notfull,p-lock);

}

p-buffer[p-writepos] =data;

p-writepos++;

if(p-writepos = BUFFER_SIZE)

p-writepos = 0;

pthread_cond_signal(p-notempty);

pthread_mutex_unlock(p-lock);

}

/*從緩衝區取出整數*/

int get(struct prodcons *p)

{

int data;

pthread_mutex_lock(p-lock);

/*等待緩衝區非空*/

if(p-writepos == p-readpos)

{

pthread_cond_wait(p-notempty ,p-lock);//非空就設置條件變數notempty

}

/*讀書據,移動讀指針*/

data = p-buffer[p-readpos];

p-readpos++;

if(p-readpos == BUFFER_SIZE)

p-readpos = 0;

/*設置緩衝區未滿的條件變數*/

pthread_cond_signal(p-notfull);

pthread_mutex_unlock(p-lock);

return data;

}

/*測試:生產站線程將1 到1000的整數送入緩衝區,消費者線程從緩衝區中獲取整數,兩者都列印信息*/

#define OVER (-1)

struct prodcons buffer;

void *producer(void *data)

{

int n;

for( n=0;n1000;n++)

{

printf(“%d ——\n”,n);

put(buffer,n);

}

put(buffer,OVER);

return NULL;

}

void *consumer(void *data)

{

int d;

while(1)

{

d = get(buffer);

if(d == OVER)

break;

else

printf(“—–%d\n”,d);

}

return NULL;

}

int main()

{

pthread_t th_p,th_c;

void *retval;

pthread_init(buffer);

pthread_create(th_p,NULL,producer,0);

pthread_create(th_c,NULL,consumer,0);

/*等待兩個線程結束*/

pthread_join(th_p, retval);

pthread_join(th_c,retval);

return 0;

}

c語言實現多線程

目錄:

Linux操作系統,C語言實現多線程

Windows操作系統,C語言實現多線程

Windows下的多線程(不帶停止)

Linux操作系統,C語言實現多線程:

#include stdio.h

#include stdlib.h

#include pthread.h

void * ThreadOne ( void * threadArg )

{

    printf ( “線程開始啦,參數是:%s\n” , (char *)threadArg );

    return NULL;

}

int main ( void )

{

    pthread_t ThreadID;   /* 記錄線程標識符 */

    void * waitingResult;  /* 等待線程退出的等待結果 */

    int errorCode;         /* 記錄線程的錯誤代碼 */

    char * aMessage = “這是線程的參數” ;

    /* 創建並啟動線程ThreadOne。若返回值非零,則線程創建失敗 */

    errorCode = pthread_create( ThreadID, NULL, ThreadOne, aMessage );

    if ( errorCode != 0 )

    {

        printf (“線程ThreadOne創建失敗。錯誤代碼:%d\n”, errorCode );

        return EXIT_FAILURE ;

    }

    /* 等待線程標識符為的ThreadID的線程結束 */

    errorCode = pthread_join( ThreadID, waitingResult );

    if ( errorCode != 0 )

    {

        printf ( “等待線程退出等待失敗。錯誤代碼:%d\n” , errorCode ) ;

        return EXIT_FAILURE ;

    }

    printf( “線程的返回值是%p\n”, waitingResult );

    return EXIT_SUCCESS ;

}

Windows操作系統,C語言實現多線程:

#include stdio.h

#include windows.h

DWORD APIENTRY ThreadOne ( LPVOID threadArg )

{

    printf ( “線程開始啦,參數是:%s\n” , (char *)threadArg );

    return 0;

}

int main ( void )

{

    HANDLE hThread;  /* 記錄線程句柄 */

    DWORD ThreadID;  /* 記錄線程ID號 */

    DWORD waitingResult;  /* 等待線程退出的等待結果 */

    DWORD threadExitCode;  /* 記錄線程的返回值 */

    char * aMessage = “這是線程的參數” ;

    /* 創建並啟動線程ThreadOne,返回值為線程句柄,賦值給hThread */

    hThread = CreateThread ( NULL, 0L, ThreadOne, (LPVOID)aMessage, 0L, ThreadID );

    if ( hThread == NULL )

    {

        printf (“線程ThreadOne創建失敗。錯誤代碼:%lu\n”, GetLastError() );

        return EXIT_FAILURE ;

    }

    /* 等待線程句柄為的hThread線程結束 */

    waitingResult = WaitForSingleObject ( hThread, INFINITE );

    if ( waitingResult == WAIT_FAILED )

    {

        printf ( “等待線程退出等待失敗。錯誤代碼:%lu\n” , GetLastError() ) ;

        return EXIT_FAILURE ;

    }

    if ( GetExitCodeThread ( hThread , threadExitCode ) )

        printf ( “線程的返回值是%lu\n”, threadExitCode ) ;

    else

        printf ( “獲取線程的返回值獲取失敗。錯誤代碼:%lu\n” , GetLastError() ) ;

    return EXIT_SUCCESS ;

}

Windows下的多線程:(不帶停止)

#include stdio.h

#include windows.h

DWORD WINAPI duoxianchen(LPVOID lpParam);

int main(int argc, char *argv[])

{

int num=0;

CreateThread(NULL,NULL,duoxianchen,num,NULL, NULL);

while(1)

{

num++; 

printf(“主線程! %05d\n”,nu***eep(40);

}

return 0;

}

DWORD WINAPI duoxianchen(LPVOID lpParam)

{

int* a=lpParam;

while(1) 

{

++*a; 

printf(“副線程! %05d 0x%p\n”,*a,a); 

Sleep(80);

}

return 0;

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/187559.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-28 06:23
下一篇 2024-11-28 06:23

相關推薦

  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 掌握magic-api item.import,為你的項目注入靈魂

    你是否曾經想要導入一個模塊,但卻不知道如何實現?又或者,你是否在使用magic-api時遇到了無法導入的問題?那麼,你來到了正確的地方。在本文中,我們將詳細闡述magic-api的…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python線程等待指南

    本文將從多個方面詳細講解Python線程等待的相關知識。 一、等待線程結束 在多線程編程中,經常需要等待線程執行完畢再進行下一步操作。可以使用join()方法實現等待線程執行完畢再…

    編程 2025-04-29
  • 如何將Java項目分成Modules並使用Git進行版本控制

    本文將向您展示如何將Java項目分成模塊,並使用Git對它們進行版本控制。分割Java項目可以使其更容易維護和拓展。Git版本控制還可以讓您跟蹤項目的發展並協作開發。 一、為什麼要…

    編程 2025-04-28
  • GitHub好玩的開源項目

    本文旨在介紹GitHub上一些好玩的開源項目,並提供代碼示例供讀者參考和學習。 一、Emoji列表 GitHub上有一份完整的Emoji列表,它支持各種平台和設備,方便用戶在Git…

    編程 2025-04-28

發表回復

登錄後才能評論