1. 程式人生 > >一步一步學習多執行緒程式設計之CreateThread

一步一步學習多執行緒程式設計之CreateThread

CreatThread函式如下圖所示

在這裡我們只用到了第三個和第四個引數,第三個引數傳遞了一個函式的地址,也是我們要指定的新的執行緒。第四個引數是傳給新執行緒的引數指標。

// ThreadCreateTest.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<windows.h>

int time = 0;
void ThreadProc1()
{

	int hour = 0;
	int mins = 0;
	while(1)
	{
		hour = time/60;
		mins = time%60;
		
		int day = hour/24;
		
		if (day)
		{
			hour -=day*24;
		}
		time++;
		
		printf("執行緒1 %d:%d\n",hour,mins);
		Sleep(1000);
	   // system("cls");
	}

}

void ThreadProc2()
{
	int hour = 0;
	int mins = 0;
	while(1)
	{
		
		hour = time/60;
	    mins = time%60;
		int day = hour/24;//超過24個小時的話

		if (day)
		{
			hour -=day*24;
		}
		time++;
		printf("執行緒2 %d:%d\n",hour,mins);
		Sleep(1000);
		//system("cls");

	}
}

int main()
{

	HANDLE hThread1  = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc1,NULL,0,0);
	CloseHandle(hThread1);
	HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc2,NULL,0,0);
	CloseHandle(hThread2);
	
	getchar();
	return 0;
	
	
}
        儘管上面程式看上去是併發進行,但是有時候也不一定按照執行緒1:執行緒2的輸出。這涉及到多執行緒的同步問題。對於一個資源被多個執行緒共用會導致程式的混亂,我們的解決方法是隻允許一個執行緒擁有對共享資源的獨佔,這樣就能夠解決上面的問題了。

HANDLE CreateMutex

 LPCTSTR);

Parameters

lpMutexAttributes
[in] Ignored. Must be NULL.
bInitialOwner
[in] Boolean that specifies the initial owner of the mutex object. If this value is TRUE and the caller created the mutex, the calling thread obtains ownership of the mutex object. Otherwise, the calling thread does not obtain ownership of the mutex. To determine if the caller created the mutex, see the Return Values section.
lpName
[in] Long pointer to a null-terminated string specifying the name of the mutex object. The name is limited to MAX_PATH characters and can contain any character except the backslash path-separator character (\). Name comparison is case sensitive.

If lpName matches the name of an existing named mutex object, the bInitialOwner

parameter is ignored because it has already been set by the creation process.

If lpName is NULL, the mutex object is created without a name.

If lpName matches the name of an existing event, semaphore, or file-mapping object, the function fails and theGetLastError function returns ERROR_INVALID_HANDLE. This occurs because these objects share the same name space. 

該函式用於創造一個獨佔資源,第一個引數我們沒有使用,可以設為NULL,第二個引數指定該資源初始是否歸屬建立它的程序,第三個引數指定資源的名稱。



HANDLE hMutex;
void ThreadProc1()
{
	int hour = 0;
	int mins = 0;
	while(1)
	{
		WaitForSingleObject(hMutex, INFINITE);
		hour = time/60;
		mins = time%60;
		
		int day = hour/24;
		
		if (day)
		{
			hour -=day*24;
		}
		time++;
		
		printf("執行緒1 %d:%d\n",hour,mins);
		Sleep(1000);
		ReleaseMutex(hMutex);
	   // system("cls");
	}

}



相關推薦

學習執行程式設計CreateThread

CreatThread函式如下圖所示 在這裡我們只用到了第三個和第四個引數,第三個引數傳遞了一個函式的地址,也是我們要指定的新的執行緒。第四個引數是傳給新執行緒的引數指標。 // ThreadC

執行程式設計Linux環境下的執行)——好文

一、Linux環境下的執行緒   相對於其他作業系統,Linux系統核心只提供了輕量級程序的支援,並未實現執行緒模型。Linux是一種“多程序單執行緒”的作業系統,Linux本身只有程序的概念,而其所謂的“執行緒”本質上在核心裡仍然是程序。      程序是資源分配的單位,同一程序中的多個執行緒共享該程序的

三十五、java學習--執行程式設計

Java 多執行緒程式設計 Java 給多執行緒程式設計提供了內建的支援。 一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。 多執行緒是多工的一種特別的形式,但多執行緒使用了更小的資源開銷。 這裡定義和執行緒相關的

Linux程式設計學習筆記----執行程式設計執行同步條件變數

轉載請註明出處:http://blog.csdn.net/suool/article/details/38582521. 基本概念與原理 互斥鎖能夠解決資源的互斥訪問,但是在某些情況下,互斥並不能解決問題,比如兩個執行緒需 要互斥的處理各自的操作,但是一個執行緒的操作僅僅存

java執行程式設計使用Synchronized塊同步變數

通過synchronized塊來同步特定的靜態或非靜態方法。 要想實現這種需求必須為這些特性的方法定義一個類變數,然後將這些方法的程式碼用synchronized塊括起來,並將這個類變數作為引數傳入synchronized塊   下面的程式碼演示瞭如何同步特定的類方法:

執行程式設計Runnable與Callable區別

Runnable @FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used

執行程式設計執行基礎

前言 此內容是閱讀了書籍《JAVA多執行緒程式設計核心技術》後作為學習總結的文章,同時也梳理一下內容。建議大家有興趣都可以閱讀一下這本書,對於想了解更多的同學來說是一個很好的教材,同時建議大家多去思考和動手編寫程式碼,融會貫通之後再去看一遍,會有更多的體會。就比如《JVM底層實現最佳實戰》的書籍一樣,我讀了

執行程式設計synchronized和Lock

前言 在高併發多執行緒應用場景中對於synchronized和Lock的使用是很普遍的,這篇文章我們就來進行這些知識點的學習,比如說:公平鎖與非公平鎖、樂觀鎖與悲觀鎖、執行緒間通訊、讀寫鎖、資料髒讀等知識內容。目錄:1.同步問題的產生與案例程式碼2.synchronized解決同步問題3.Lock解決同步程

Android 執行程式設計 HandlerThread 詳解

    HandlerThread有那些特點: HandlerThread本質上是一個執行緒類,它繼承了Thread; HandlerThread有自己的內部Looper物件,可以進行looper迴圈; 通過獲取HandlerThread的looper物件傳

Linux執行程式設計員工資訊管理系統

       員工資訊管理系統是基於Linux 多執行緒併發伺服器程式設計,由伺服器端和客戶端構成,客戶端可以執行在多個不同的主機上連線伺服器,伺服器對員工資訊的操作結果通過“員工資訊檔案”來儲存,即:“員工資訊”存放在後臺的檔案中,相當於資料庫。當用戶登入後,根據使用者名稱

java執行程式設計優先順序

高優先順序的執行緒總是大部分先執行完,但是不是所有的先執行完。先執行完也不是因為先呼叫,如果更改優先順序,先執行完和和程式碼的呼叫順序無關。 優先順序具有一定的規則性,CPU總是儘量將執行資源讓給優先順序比較高的執行緒 優先順序較高的執行緒不一定每一次都先執行完 package com.

java執行程式設計讀寫鎖設計高效能快取器

解決多執行緒執行緒安全問題的主要方法是通過加鎖的方式來實現,當多個執行緒對某個變數進行讀取或寫入的時候通過加鎖來限定只有當前獲取鎖許可權的執行緒才可以對資料進行讀寫,當該執行緒訪問完畢釋放鎖之後其他阻

java 執行程式設計join()的用法

join的用法,先看幾個例子在說。 程式1: public class ThreadTest implements Runnable {  public static int a = 0;  public synchronized void inc() {   a+

java執行程式設計連續列印abc的幾種解法

java多執行緒程式設計之連續列印abc的解法 一道程式設計題如下: 例項化三個執行緒,一個執行緒列印a,一個執行緒列印b,一個執行緒列印c,三個執行緒同時執行,要求打印出10個連著的abc。 題目分析: 通過題意我們可以得出,本題需要我們使用三個執行緒

JAVA併發:執行程式設計同步“監視器monitor”(三)

在JAVA虛擬機器中,每個物件(Object和class)通過某種邏輯關聯監視器,為了實現監視器的互斥功能,每個物件(Object和class)都關聯著一個鎖(有時也叫“互斥量”),這個鎖在作業系統書籍中稱為“訊號量”,互斥(“mutex”)是一個二進位制的訊號量。 如果一個執行緒擁有了某些資料的鎖,其他的

我的android執行程式設計路(2)RxJava Schedulers原始碼分析

寫在伊始 上一篇介紹了執行緒的一些基礎知識和工作這麼久以後對於多執行緒部分的使用經驗之路,這篇主要對RxJava執行緒控制部分進行分析。 RxJava(本文就RxJava2.0分析) 說實話,近一年多一直在用rxjava進行專案架構的編寫及封裝及一些非

python執行程式設計Queue---put/get 方法的阻塞

python 中,佇列是執行緒間最常用的交換資料的形式。Queue模組是提供佇列操作的模組,雖然簡單易用,但是不小心的話,還是會出現一些意外。 1. 阻塞模式導致資料汙染 import Queue        q = Queue.Queue(10)        for

執行程式設計建立執行(Windows下C++實現)

執行緒概述 理解Windows核心物件 執行緒是系統核心物件之一。在學習執行緒之前,應先了解一下核心物件。核心物件是系統核心分配的一個記憶體塊,該記憶體塊描述的是一個數據結構,其成員負責維護物件的各種資訊。核心物件的資料只能由系統核心來訪問,應用程式無法在記

java&android執行池-Executor框架ThreadPoolExcutor&ScheduledThreadPoolExecutor淺析(執行程式設計三)

java多執行緒-概念&建立啟動&中斷&守護執行緒&優先順序&執行緒狀態(多執行緒程式設計之一)java多執行緒同步以及執行緒間通訊詳解&消費者生產者模式&死鎖&Thread.join()(多執行緒程式設計之二)

我的android執行程式設計路(1)經驗詳解,原始碼分析

寫在伊始 android開發這麼久了,對於多執行緒這塊一直處於似懂非懂的神奇狀態,今天總結出來,分享一下,希望大家多多指正。共同交流,懇望得到您的建議。 本文簡介 本文會基於自己在開發中對於執行緒這塊的實際使用,大概從執行緒程序的概念,執行緒的建立(T