1. 程式人生 > >Linux--多執行緒訪問全域性變數互斥的例子

Linux--多執行緒訪問全域性變數互斥的例子

以下案例是兩個執行緒同時訪問一個全域性worker變數,並分別對裡面的成員counter進行增長

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>

#define MAX_NUM 5000

typedef struct 
{
	int counter;
	pthread_mutex_t counter_mutex;
}COUNTER;

COUNTER worker;

void *run(void *arg)
{
	int i = 0;
	int val = 0;
	char line[1024] = {0};
	for (; i < MAX_NUM; ++i)
	{
		pthread_mutex_lock(&worker.counter_mutex);
		val = worker.counter;
		sprintf(line, "thread = %d, counter = %d\n", (int)pthread_self(), val+1);
		write(STDOUT_FILENO, line, strlen(line));
		worker.counter = val + 1;
		memset(line, 0, strlen(line));
		pthread_mutex_unlock(&worker.counter_mutex);
	}
}

int main(int argc, char *argv[])
{
	pthread_t tid1, tid2;
	
	worker.counter = 0;
	pthread_mutex_init(&worker.counter_mutex, NULL);
	
	pthread_create(&tid1, NULL, run, NULL);
	pthread_create(&tid2, NULL, run, NULL);
	
	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);
	
	pthread_mutex_destroy(&worker.counter_mutex);
	return 0;
}


相關推薦

Linux--執行訪問全域性變數互斥例子

以下案例是兩個執行緒同時訪問一個全域性worker變數,並分別對裡面的成員counter進行增長 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include &

Python 執行,(全域性變數)資料共享,threading.Lock() 互斥

  demo.py(互斥鎖): import threading import time # 定義一個全域性變數 g_num = 0 def test1(num): global g_num # 全域性變數可以實現執行緒間資料共享。也可以通過傳參實現 fo

基於執行全域性變數

def current_nation default_nation = (current_contact && current_contact&.company&.country) ? current_contact&.company&.count

執行-共享全域性變數

from threading import Thread import time g_num = 100 def work1(): global g_num for i in range(3): g_num += 1 print("----in wo

python執行-共享全域性變數

目錄 多執行緒-共享全域性變數 多執行緒-共享全域性變數 列表當作實參傳遞到執行緒中 總結 多執行緒-共享全域性變數問題 多執行緒開發可能遇到的問題 測試1 測試2 多執行緒-共享全域性變數 多執行緒-共享全域性變

linux執行程式設計——同步與互斥

我們在前面文章中已經分析了多執行緒VS多程序,也分析了執行緒的使用,現在我們來講解一下linux多執行緒程式設計之同步與互斥。 現在,我們不管究竟是多執行緒好還是多程序好,先講解一下,為什麼要使用多執行緒? 一、 為什麼要用多執行緒技術? 1、避免阻塞,大家知道,單個程序只

執行---共享全域性變數

多執行緒-共享全域性變數 from threading import Thread import time g_num = 100 def work1(): global g_num

執行-共享全域性變數問題

1. 多執行緒同時對全域性變數進行操作 import threading #定義全域性變數 g_num = 0 #迴圈一次給全域性變數加1 def sum_num1(): for i in range(1000000): global g_num g_num +

linux執行程式設計 同步與互斥

——本文一個例子展開,介紹Linux下面執行緒的操作、多執行緒的同步和互斥。 前言 執行緒?為什麼有了程序還需要執行緒呢,他們有什麼區別?使用執行緒有什麼優勢呢?還有多執行緒程式設計的一些細節問題,如執行緒之間怎樣同步、互斥,這些東西將在本文中介紹。我在某QQ群裡見到這樣一道面試題: 是否熟悉POSIX多

Linux執行】同步與互斥的區別

同步與互斥這兩個概念經常被混淆,所以在這裡說一下它們的區別。 一、同步與互斥的區別 1. 同步 同步,又稱直接制約關係,是指多個執行緒(或程序)為了合作完成任務,必須嚴格按照規定的 某種先後次序來執行。 例如,執行緒 T2 中的語句 y 要使用執行緒

Linux執行程式設計---執行間同步(互斥鎖、條件變數、訊號量和讀寫鎖)

本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導

Linux執行學習(2)--執行的同步與互斥及死鎖問題(互斥量和條件變數)

Linux多執行緒學習總結 一.互斥量 1.名詞理解 2.什麼是互斥量(mutex) 3.互斥量的介面 3.1 初始化訊號量 3.2 銷燬訊號量 3.3 互斥量加鎖和解鎖

Linux執行消費者和生產者模型例項(互斥鎖和條件變數使用)

條件變數簡單介紹: 條件變數是執行緒可以使用的另一種同步機制。條件變數與互斥量一起使用的時候,允許執行緒以無競爭的方式等待特定的條件發生。條件本身是由互斥量保護的。執行緒在改變條件變數狀態前必須先鎖住互斥量。另一種是動態分配的條件變數,則用pthread_cond_ini

linux執行入門(二)互斥

當多個執行緒訪問一個共享的變數的時候是非常危險的,可能會拿到錯誤的資料或者程式崩潰! 所以為了安全的使用執行緒引入了互斥量的做法 兩個互斥量的函式為 pthread_mutex_lock(pthread_mutex_lock* lock) pthread_mutex_unlock(p

Linux執行實踐(8) --Posix條件變數解決生產者消費者問題

Posix條件變數int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_cond_t *cond); int

Linux 執行同步問題 條件變數

互斥鎖:用來上鎖。 條件變數:用來等待,當條件變數用來自動阻塞一個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。 函式介紹: 1. 名稱: pthread_cond_init 目標: 條件變數初始化 標頭檔案: #include &

linux執行中的共享變數

當解決多執行緒互斥同步的問題時,經常會有如下幾個問題:1. 在一個給定的問題中,需要多少個Mutex,多少個Semaphore?有什麼規律?2. 在對臨界區加鎖和等待訊號量的順序上有什麼要求和規律?3. 什麼樣操作適合放在臨界區,什麼樣的不適合?下面就生產者和消費者問題來分

java執行的共享變數訪問控制例項

最近打算去一家電商公司,對於高併發的資料訪問控制有著嚴格的要求,近期打算把多執行緒的知識在好好補一下。 執行緒排程有五個狀態; 開始,可執行,執行,阻塞,死亡。 啟動執行緒有兩種方法。繼承Thread類或則實現Runnable介面,其實Thread類也實現

執行訊號量,互斥鎖,條件變數異同

條件變數類似於訊號量,一旦條件“成熟”則進行處理,條件變數能使執行緒處於wait狀態,另一個執行緒在滿足條件的時候發signal,然後所有處於wait的執行緒依次得到喚醒,條件變數通過執行緒阻塞和可以給另一個執行緒傳送signal喚醒執行緒的優厚條件彌補了互斥鎖只有加鎖和解鎖的這兩種情況,在一般情況下,條件變

Linux 執行同步與互斥

1.同步 同一個程序中的多個執行緒共享所在程序的記憶體資源,當多個執行緒在同一時刻同時訪問同一種共享資源時,需要相互協調,以避免出現數據的不一致和覆蓋等問題,執行緒之間的協調和通訊的就叫做執行緒的同步問題, 執行緒同步的思路: 讓多個執行緒依次訪問共享資源,而不是並行 我