c語言線程函數
① c語言線程簡單例題
您好,這樣的:
通過pthread_join得到的終止狀態是不同的,總結如下:
1.如果thread線程通過return返回,rval_ptr所指向的單元里存放的是thread線程函數的返回值。
2. 如果thread線程被別的線程調用pthread_cancel異常終止掉,rval_ptr所指向的單元里存放的是常數PTHREAD_CANCELED。
3.如果thread線程是自己調用pthread_exit終止的,rval_ptr所指向的單元存放的是傳給pthread_exit的參數。
② c語言 怎麼定義一個多線程函數呢,急等
main()
{
if(!fork())
  {
    //代碼
    //...新線程,與原線程共享數據空間
  }
else
  {
    //代碼
    //..原線程,與新線程共享數據空間
  }
}
這樣就可以了 
但是vc不可以用的
vc有自己的c++多線程函數
③ C語言多線程式控制制函數
this.Invoke((EventHandler)(delegate
            {
                    READ1();
            }));
 this.Invoke((EventHandler)(delegate
            {
                    READ2();
            }));
④ 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語言多線程實現
多線程隨機選號程序
以下程序運行後看起來比較有意思,像一個隨機選號程序,但不是完全按照問題所說的寫的
可供參考,要改很容易
//多線程隨機選號程序示例
#include
<stdio.h>
#include
<Windows.h>
#include
<ctime>
#include
<cstdlib>
#include
<process.h>
bool
g_run
=
true;
//是否運行
void
userInput(void*)
//監視輸入的線程函數
{
while
(true)
{
if
(getchar()=='\n')
//是否輸入回車
{
g_run
=
!g_run;
//回車運行
回車暫停
}
Sleep(10);
//延遲
}
}
int
main()
{
srand(time(0));
//隨機數種子
_beginthread(userInput,0,NULL);
//開線程
while
(true)
{
if
(g_run)
{
system("cls");
//清屏
int
t
=
rand()
%
1000+
1;//1-1000的隨機數
printf("\n
%d",t);
//輸出
}
Sleep(50);
//延遲50毫秒
}
return
0;
}
⑥ C語言 殺死線程 Api函數
GetExitCodeThread函數可以得到線程終結時的返回值,因為線程終結了,所以系統中不再有這個線程,hThreadRcvData本身已經無效,所以調用TerminateThread函數會失敗。
⑦ 請問用C語言在windows上建立多線程需要用什麼函數最好,
#include<windows.h>
#include<fstream.h>
#include<stdio.h>
#include<string>
#include<conio.h>
//定義一些常量;
//本程序允許的最大臨界區數;
#define MAX_BUFFER_NUM 10
//秒到微秒的乘法因子;
#define INTE_PER_SEC 1000
//本程序允許的生產和消費線程的總數;
#define MAX_THREAD_NUM 64
//定義一個結構,記錄在測試文件中指定的每一個線程的參數
struct ThreadInfo
{
 int serial;        //線程序列號
 char entity;           //是P還是C
 double delay;       //線程延遲
 int thread_request[MAX_THREAD_NUM];  //線程請求隊列
 int n_request;       //請求個數
};
//全局變數的定義
//臨界區對象的聲明,用於管理緩沖區的互斥訪問;
CRITICAL_SECTION PC_Critical[MAX_BUFFER_NUM]; 
int         Buffer_Critical[MAX_BUFFER_NUM]; //緩沖區聲明,用於存放產品;
HANDLE    h_Thread[MAX_THREAD_NUM];  //用於存儲每個線程句柄的數組;
ThreadInfo Thread_Info[MAX_THREAD_NUM];  //線程信息數組;
HANDLE empty_semaphore;      //一個信號量;
HANDLE h_mutex;        //一個互斥量;
DWORD  n_Thread = 0;          //實際的線程的數目;
DWORD  n_Buffer_or_Critical;        //實際的緩沖區或者臨界區的數目;
HANDLE h_Semaphore[MAX_THREAD_NUM]; //生產者允許消費者開始消費的信號量;
//生產消費及輔助函數的聲明
void  Proce(void *p);
void  Consume(void *p); 
bool  IfInOtherRequest(int);
int   FindProcePositon();
int   FindBufferPosition(int);
int    main(void)
{
 //聲明所需變數;
 DWORD  wait_for_all;
 ifstream inFile;
    
 //初始化緩沖區;
 for(int i=0;i< MAX_BUFFER_NUM;i++)
  Buffer_Critical[i] = -1;    
 //初始化每個線程的請求隊列;
 for(int j=0;j<MAX_THREAD_NUM;j++){
  for(int k=0;k<MAX_THREAD_NUM;k++)
   Thread_Info[j].thread_request[k] = -1;
  Thread_Info[j].n_request = 0;
 }
 //初始化臨界區;
 for(i =0;i< MAX_BUFFER_NUM;i++) 
  InitializeCriticalSection(&PC_Critical[i]);
 //打開輸入文件,按照規定的格式提取線程等信息;
 inFile.open("test.txt");
 //從文件中獲得實際的緩沖區的數目;
 inFile >> n_Buffer_or_Critical;
 inFile.get();
 printf("輸入文件是:\n");
 //回顯獲得的緩沖區的數目信息;
 printf("%d \n",(int) n_Buffer_or_Critical);
 //提取每個線程的信息到相應數據結構中;
 while(inFile){
  inFile >> Thread_Info[n_Thread].serial;
  inFile >> Thread_Info[n_Thread].entity;
  inFile >> Thread_Info[n_Thread].delay;
  char c;
  inFile.get(c);
  while(c!='\n'&& !inFile.eof()){
   inFile>> Thread_Info[n_Thread].thread_request[Thread_Info[n_Thread].n_request++];
   inFile.get(c); 
  }
  n_Thread++;
 }  
 //回顯獲得的線程信息,便於確認正確性; 
 for(j=0;j<(int) n_Thread;j++){
  int    Temp_serial  = Thread_Info[j].serial;
  char   Temp_entity  = Thread_Info[j].entity;
  double Temp_delay   = Thread_Info[j].delay;
  printf(" \n thread%2d    %c    %f   ",Temp_serial,Temp_entity,Temp_delay);
  int Temp_request = Thread_Info[j].n_request;
  for(int k=0;k<Temp_request;k++)
   printf(" %d    ", Thread_Info[j].thread_request[k]);
  cout<<endl;
 }
 printf("\n\n");
  //創建在模擬過程中幾個必要的信號量
 empty_semaphore=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical,
          "semaphore_for_empty");
 h_mutex = CreateMutex(NULL,FALSE,"mutex_for_update");
 //下面這個循環用線程的ID號來為相應生產線程的產品讀寫時所
 //使用的同步信號量命名;
 for(j=0;j<(int)n_Thread;j++){     
  std::string lp ="semaphore_for_proce_";
  int temp =j;
  while(temp){
  char c = (char)(temp%10);
  lp+=c;
  temp/=10;
  }
  h_Semaphore[j+1]=CreateSemaphore(NULL,0,n_Thread,lp.c_str());    
 }
 //創建生產者和消費者線程;
 for(i =0;i< (int) n_Thread;i++){
  if(Thread_Info[i].entity =='P')
   h_Thread[i]= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Proce),
         &(Thread_Info[i]),0,NULL);
  else
     h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume),
        &(Thread_Info[i]),0,NULL);
 }
 //主程序等待各個線程的動作結束;
 wait_for_all = WaitForMultipleObjects(n_Thread,h_Thread,TRUE,-1);
 printf(" \n \nALL Procer and consumer have finished their work. \n");
 printf("Press any key to quit!\n");
 _getch();
 return 0;
}
//確認是否還有對同一產品的消費請求未執行;
bool IfInOtherRequest(int req)
{
 for(int i=0;i<n_Thread;i++)
  for(int j=0;j<Thread_Info[i].n_request;j++)
   if(Thread_Info[i].thread_request[j] == req)
    return TRUE;
 return FALSE;
}
//找出當前可以進行產品生產的空緩沖區位置;
int FindProcePosition()
{
 int EmptyPosition;
 for (int i =0;i<n_Buffer_or_Critical;i++)
  if(Buffer_Critical[i] == -1){
   EmptyPosition = i;
   //用下面這個特殊值表示本緩沖區正處於被寫狀態;
   Buffer_Critical[i] = -2;
   break;
  }
 return  EmptyPosition;
}
//找出當前所需生產者生產的產品的位置;
int FindBufferPosition(int ProPos)
{
 int TempPos;
 for (int i =0 ;i<n_Buffer_or_Critical;i++)
  if(Buffer_Critical[i]==ProPos){
   TempPos = i;
   break;
  }
 return TempPos;
}
//生產者進程
void Proce(void *p)
{
 //局部變數聲明;
 DWORD wait_for_semaphore,wait_for_mutex,m_delay;
 int  m_serial;
 //獲得本線程的信息;
 m_serial = ((ThreadInfo*)(p))->serial;
 m_delay  = (DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC);
 Sleep(m_delay);
 //開始請求生產
 printf("Procer %2d sends the proce require.\n",m_serial);
 //確認有空緩沖區可供生產,同時將空位置數empty減1;用於生產者和消費者的同步;
 wait_for_semaphore =  WaitForSingleObject(empty_semaphore,-1);
      
 //互斥訪問下一個可用於生產的空臨界區,實現寫寫互斥;
 wait_for_mutex  = WaitForSingleObject(h_mutex,-1);
 int  ProcePos = FindProcePosition();
    ReleaseMutex(h_mutex);
 //生產者在獲得自己的空位置並做上標記後,以下的寫操作在生產者之間可以並發;
 //核心生產步驟中,程序將生產者的ID作為產品編號放入,方便消費者識別;
 printf("Procer %2d begin  to proce at position %2d.\n",m_serial,ProcePos);
 Buffer_Critical[ProcePos] = m_serial;
 printf("Procer %2d finish procing :\n ",m_serial);
 printf("  position[ %2d ]:%3d \n" ,ProcePos,Buffer_Critical[ProcePos]);
 //使生產者寫的緩沖區可以被多個消費者使用,實現讀寫同步;
 ReleaseSemaphore(h_Semaphore[m_serial],n_Thread,NULL);
}
//消費者進程
void Consume(void * p)
{
 //局部變數聲明;
 DWORD wait_for_semaphore,m_delay;
 int m_serial,m_requestNum;         //消費者的序列號和請求的數目;
 int m_thread_request[MAX_THREAD_NUM];//本消費線程的請求隊列;
    
 //提取本線程的信息到本地;
 m_serial = ((ThreadInfo*)(p))->serial;
 m_delay  = (DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC);
 m_requestNum = ((ThreadInfo *)(p))->n_request;
 for (int i = 0;i<m_requestNum;i++)
  m_thread_request[i] = ((ThreadInfo*)(p))->thread_request[i];
Sleep(m_delay); 
 //循環進行所需產品的消費
 for(i =0;i<m_requestNum;i++){   
  
   //請求消費下一個產品
   printf("Consumer %2d request to consume %2d proct\n",m_serial,m_thread_request[i]);
   //如果對應生產者沒有生產,則等待;如果生產了,允許的消費者數目-1;實現了讀寫同步;
   wait_for_semaphore=WaitForSingleObject(h_Semaphore[m_thread_request[i]],-1); 
   //查詢所需產品放到緩沖區的號  
   int BufferPos=FindBufferPosition(m_thread_request[i]);   
   
   //開始進行具體緩沖區的消費處理,讀和讀在該緩沖區上仍然是互斥的;
   //進入臨界區後執行消費動作;並在完成此次請求後,通知另外的消費者本處請求已
   //經滿足;同時如果對應的產品使用完畢,就做相應處理;並給出相應動作的界面提
   //示;該相應處理指將相應緩沖區清空,並增加代表空緩沖區的信號量;
   EnterCriticalSection(&PC_Critical[BufferPos]);
   printf("Consumer%2d begin to consume %2d proct \n",m_serial,m_thread_request[i]);
    ((ThreadInfo*)(p))->thread_request[i] =-1;
   if(!IfInOtherRequest(m_thread_request[i])){
  Buffer_Critical[BufferPos] = -1;//標記緩沖區為空;
  printf("Consumer%2d finish consuming %2d:\n ",m_serial,m_thread_request[i]);
  printf("  position[ %2d ]:%3d \n" ,BufferPos,Buffer_Critical[BufferPos]);
  ReleaseSemaphore(empty_semaphore,1,NULL);
   }  
   else{
printf("Consumer %2d finish consuming proct %2d\n ",m_serial,m_thread_request[i]);
   }
//離開臨界區
   LeaveCriticalSection(&PC_Critical[BufferPos]);
 }
} 
看函數就行
⑧ C語言如何終止線程
有三種方式可以終止線程,具體調用函數依賴於使用的線程系統。
1 在線程入口函數中,調用return。 即退出線程入口函數,可以實現終止當前線程效果;
2 在線程執行的任意函數,調用當前線程退出函數,可以退出當前線程;
3 在任意位置,調用線程終止函數,並傳入要終止線程的標識符,即pid,可以實現終止對應線程效果。
⑨ C語言線程函數參數問題
·線程創建   
函數原型:int pthread_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的形參。 =====這個地方就可以傳參數,
注意,這個地方是個指針,要想傳多個參數,可以定義一個結構體,把要傳的參數包起來,傳結構體的地址就ok
