1. 程式人生 > >程序與執行緒學習(三)之執行緒之使用場合

程序與執行緒學習(三)之執行緒之使用場合

在對程序、執行緒的學習稍加了解後,不僅會自問在什麼情況下要使用多執行緒?畢竟,對知識的學習而不在於知識本身,而是怎麼使用所學的知識,有什麼侷限性。

但從耗時來講,我對多執行緒做了一些測試:程式如下:

只有一個主執行緒來估計買票時間;

#include "stdafx.h"
#include "windows.h"
#include "iostream"
using namespace std;

void func();

 
int ticket=500;
int starttime=GetTickCount();

void main()

{    
	 //SetProcessAffinityMask(GetCurrentProcess(),2);//這個語句可以控制CPU的使用
	 func();
	 
    
	

}
void func()
{
	    while(TRUE)

      {

           if(ticket>0)

				 cout<<"func sale the ticket id is:"<<ticket--<<endl;

           else
		   {
			     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;
                 break;
		   }

      }
}

採用雙執行緒的程式:
#include "stdafx.h"
#include "windows.h"
#include "iostream"
using namespace std;


DWORD WINAPI ThreadProc1(LPVOID lpParameter);

void func();

 

int ticket=500;
int starttime=GetTickCount();
 

void main()

{
	 //SetProcessAffinityMask(GetCurrentProcess(),2); //設定執行的CPU

      HANDLE handle1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);

      CloseHandle(handle1);
   

	 Sleep(40000);
	



}

 

DWORD WINAPI ThreadProc1(LPVOID lpParameter){

      //說明:線上程的時間片內持續執行

      while(TRUE)

      {

           if(ticket>0)

				 cout<<"thread1 sale the ticket id is:"<<ticket--<<endl;

           else
		   {
			     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;
                 break;
		   }

      }

      return 0;

}
採用三(四)執行緒的程式
// thread_ticketsselling.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"

#include "windows.h"
#include "iostream"
using namespace std;


DWORD WINAPI ThreadProc1(LPVOID lpParameter);

DWORD WINAPI ThreadProc2(LPVOID lpParameter);
DWORD WINAPI ThreadProc3(LPVOID lpParameter);

 

int ticket=500;
int starttime=GetTickCount();
 

void main()

{
	  //SetProcessAffinityMask(GetCurrentProcess(),2); //設定執行的CPU
      HANDLE handle1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
      HANDLE handle2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
	  HANDLE handle3=CreateThread(NULL,0,ThreadProc3,NULL,0,NULL);
      CloseHandle(handle1);
      CloseHandle(handle2);
	  CloseHandle(handle3);
	 
  /*說明:為了使得主執行緒在退出之前保證副程序的執行完成,有些實現方法是採用恆真的空迴圈,單此種方法主執行緒會佔用cpu的執行時間,如	果採用Sleep,則主執行緒完全不佔用cpu的任何執行時間*/
	 
	 //cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;
	Sleep(40000);
	

  //getchar();//VS2008

}


 
DWORD WINAPI ThreadProc1(LPVOID lpParameter){

      //說明:線上程的時間片內持續執行

      while(TRUE)

      {

           if(ticket>0)

				 cout<<"thread1 sale the ticket id is:"<<ticket--<<endl;

           else
		   {
			     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;
                 break;
		   }

      }

      return 0;

}

DWORD WINAPI ThreadProc2(LPVOID lpParameter)

{

      while(TRUE)

      {

           if(ticket>0)

				 cout<<"thread2 sale the ticket id is:"<<ticket--<<endl;

           else
		   {
			     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;
                 break;
		   }

      }

      return 0;

}
DWORD WINAPI ThreadProc3(LPVOID lpParameter){

      //說明:線上程的時間片內持續執行

      while(TRUE)

      {

           if(ticket>0)

				 cout<<"thread3 sale the ticket id is:"<<ticket--<<endl;

           else
		   {
			     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;
                 break;
		   }

      }

      return 0;

}
各個執行緒的耗時彙總如下:


從這個測試來看,並不是所有的程式都適合多執行緒的,但是多核CPU的使用效果還是非常明顯的。那麼什麼情況下使用多執行緒呢?

顯然的是:多執行緒的使用要比多程序更節約CPU資源和時間。

多執行緒的情況下,CPU還要花時間去維護,CPU處理各執行緒的請求時線上程間的切換以及對執行緒的管理也要花時間,所以一般情況下是可以不用多執行緒的,用了有時反而會得不償失。

大多情況下,要用到多執行緒的主要是

A、耗時或大量佔用處理器的任務,阻塞使用者介面操作。

B、各個任務必須等待外部資源(如遠端檔案或 Internet連線)。

比如:讀寫檔案、視訊影象的採集、處理、顯示、儲存等。

後記:

這裡就存在疑問了?在多核下,對多執行緒的處理可以看成是並行的,如果執行緒間的資料及變數是相互獨立的,那麼情況就變得簡單,問題是如果執行緒的資料及變數是相關聯的,那麼計算機是怎麼解決這個問題的呢,這個時候的資料處理可不可以看成是並行的呢?正如Hadoop在並行資料處理方面的問題,現階段是否有一種方法或機制來解決強關聯資料的並行運算問題呢?


相關推薦

執行學習執行的互斥

生產者與消費者模型 在講同步和互斥之前,首先了解一下消費者模型 什麼是消費者模型? 消費者模型是一個描述消費者和生產者之間的關係的一個模型,生產者和消費者模型指的是在一個場所中,兩個角色,三種關係 消費者和消費者之間——互斥 消費者之間是競爭關係,比如有一個

執行學習——控制執行

Java裡提供了一些工具方法,通過這些方法可以很好地控制執行緒的執行。1、join執行緒        Thread提供了讓一個執行緒等待另一個執行緒完成的方法——join()方法。當在某個程式執行流中呼叫其他執行緒的join()方法時,呼叫執行緒將被阻塞,直到被join()

程序執行學習執行使用場合

在對程序、執行緒的學習稍加了解後,不僅會自問在什麼情況下要使用多執行緒?畢竟,對知識的學習而不在於知識本身,而是怎麼使用所學的知識,有什麼侷限性。 但從耗時來講,我對多執行緒做了一些測試:程式如下: 只有一個主執行緒來估計買票時間; #include "stdafx.h"

Linux多執行學習pthread_key_create

函式 pthread_key_create() 用來建立執行緒私有資料。該函式從 TSD 池中分配一項,將其地址值賦給 key 供以後訪問使用。第 2 個引數是一個銷燬函式,它是可選的,可以為 NULL,為 NULL 時,則系統呼叫預設的銷燬函式進行相關的資料登出。如果不為空

執行學習:isAlive()和sleep()和getId()

isAlive() isAlive()判斷執行緒是否處於活動狀態,即執行緒已經啟動但尚未終止。 例一 public class MyThread extends Thread{ @Override public void run() { System.out.prin

執行學習——建立執行種方式及比較

最近在學習多執行緒,在這裡總結一下學習到的內容(參考《瘋狂Java講義第3版》):一、建立執行緒有三種方式:      1、繼承Thread類      2、實現Runnable介面      3、使用Callable和Future二、分別介紹用法:繼承Thread類/*下面

執行基礎-多執行併發安全問題

多執行緒基礎(三)-多執行緒併發安全問題 當多個執行緒併發操作同一資源時,由於執行緒切換實際不可控會導致操作邏輯執行順序出現混亂,嚴重時會導致系統癱瘓。例如下面的程式碼 public class SyncDemo { public static void main(Strin

執行學習執行間的資料共享

資料不共享的情況 public class MyThread04 extends Thread{ private int count=5; public MyThread04(String threadName) { this.setName(threadName); }

執行通訊執行通知/等待交叉進行

        如何向A、B兩個檔案中寫資料並且向A、B中寫資料是交叉進行的,假定向A中寫資料的是A執行緒,向B中寫資料的是B執行緒,那麼可以通過定義一個標識,用來控制A、B執行緒的交叉效果。定義輸出類public class FileOutput { // 定義v

Java多執行學習1——停止執行

目錄: 1.interrupt方法學習(基礎知識) 2.異常法 3.sleep法 4.return法 5.stop法(不推薦) 1.interrupt方法學習(基礎知識) 呼叫interrupt方法只是對執行緒做了一個標記(停止標記),並沒有停止執行緒的效果,需要結合以下

Java學習面向對象封裝

所有 成對 main 將不 同時 執行順序 編譯失敗 sta sin 封 裝(面向對象特征之一):是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。 好處:將變化隔離;便於使用;提高重用性;安全性。 封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法

Android so註入(inject)和Hook技術學習——Got表hook導出表hook

open bin fopen store 模塊 技術學習 個數 where detail 前文介紹了導入表hook,現在來說下導出表的hook。導出表的hook的流程如下。1、獲取動態庫基值    1 void* get_module_base(pid_t pid,

springMVC學習表單提交資料封裝

結合springmvc學習(一)和(二),我們可以讓伺服器啟動時,首先訪問hello.jsp,然後頁面提交後到TestController中,接著返回到hello.jsp頁面。專案結構如下: 配置如下: ①web.xml中配置如下: <?xml version="

PE檔案學習資料目錄表資源

     資源是PE檔案中最複雜的結構了,資源在PE檔案中是以目錄結構的形式存在的,一般情況下分為3層,從根目錄開始分別是資源型別、目錄資源ID與資原始碼頁。      3層目錄結構都是由一個IMAGE_RESOURCE_DIRECTORY結構為頭部,後面跟著一個IMAGE

執行學習4種實現Java多執行的方法:Thread、Callable和Runable 的比較區別

2018年10月03日 目錄 前言 前言 JVM允許應用程式併發執行多執行緒:最常用的是兩個方法:(1)基礎Thread類,重寫run()方法;(2)或實現Runnable 介面,實現介面的run()方法;(3)另外一種方法是:實現callable 介面

非同步程式設計學習-多執行之間的協作通訊

本文是非同步程式設計學習之路(三)-多執行緒之間的協作與通訊,若要關注前文,請點選傳送門: 非同步程式設計學習之路(二)-通過Synchronize實現執行緒安全的多執行緒 通過前文,我們學習到如何實現同步的多執行緒,但是在很多情況下,僅僅同步是不夠的,還需要執行緒與執行緒協作(通訊),生產

Golang原始碼學習:排程邏輯工作執行執行流程排程迴圈

本文內容主要分為三部分: 1. main goroutine 的排程執行 2. 非 main goroutine 的退出流程 3. 工作執行緒的執行流程與排程迴圈。 ## main goroutine 的排程執行 runtime·rt0_go中在呼叫完runtime.newproc建立main gorouti

【轉】JMeter學習元件的作用域執行順序

ces ner 處理器 規則 fig 子節點 控制器 conf 節點 1.元件的作用域 JMeter中共有8類可被執行的元件(測試計劃與線程組不屬於元件),這些元件中,取樣器是典型的不與其它元件發生交互作用的元件,邏輯控制器只對其子節點的取樣器有效,而其它元件(config

JMeter學習元件的作用域執行順序

1.元件的作用域 JMeter中共有8類可被執行的元件(測試計劃與執行緒組不屬於元件),這些元件中,取樣器是典型的不與其它元件發生互動作用的元件,邏輯控制器只對其子節點的取樣器有效,而其它元件(config elements 、timers 、post-proces

Kotlin學習記錄—— 子執行獲取資料,實現簡單ListView

上一篇簡單介紹了Kotlin的一些基礎構成,當然還有像物件宣告、操作符等等都未涉及到,這些會在以後用到的過程中進行詳細說明。 專案中ListView列表出現的頻率是很高的,我們就以實現一個簡單ListView為目標,介紹一下在子執行緒中獲取資料等問題。 首先在la