當前位置:首頁 » 數據倉庫 » c多線程讀取資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c多線程讀取資料庫

發布時間: 2022-12-10 04:41:22

Ⅰ C/C++用一個連接多線程並發訪問資料庫會不會有問題

加個原子鎖吧,盡量非同步訪問

Ⅱ C 語言多線程怎麼讀文件高效

c語言---多個線程讀取文件,其代碼如下:
#include
#include
#include
#include
#include
#include
#define THREAD_NUM 25
typedef struct
{undefined
FILE *_fp;
int _nThreadId;//第幾個線程
sem_t *_semLock;
}IDD_THREAD_PARAM;
void *ThreadFunc(void *args)
{undefined
char sLine[100+1];
FILE *fpRead = ((IDD_THREAD_PARAM *)args)->_fp;
sem_t *semLock = ((IDD_THREAD_PARAM *)args)->_semLock;
int nId = ((IDD_THREAD_PARAM *)args)->_nThreadId;
sem_wait(semLock);
while(!feof(fpRead))
{undefined
memset(sLine,0,sizeof(sLine));
fgets(sLine,100,fpRead);
fprintf(stderr,"Thread ID-%d:%s",nId,sLine);
}
sem_post(semLock);
}
int main()
{undefined
pthread_t *pThreads;
sem_t semLock;
pThreads = (pthread_t *)malloc(THREAD_NUM*sizeof(pthread_t));
sem_init(&semLock,0,1);
FILE *fp = fopen("test.txt","r");
//開始線程循環
IDD_THREAD_PARAM param;
for(int i=0;i
{undefined
memset(param,0,sizeof(IDD_THREAD_PARAM));
param._fp = fp;
param._nThreadId = i;
param._semLock = &semLock;
pthread_create((pThreads+i),NULL,ThreadFunc,param);
}
for(int i=0;i
pthread_join(*(pThreads+i),NULL);
free(pThreads);
pThreads = NULL;
fclose(fp);
fp = NULL;
return 0;
}

Ⅲ c++資料庫那種最快,支持多線程,或文本資料庫

選擇成品資料庫,要看之後的應用結構的才能確定用哪個快..
如果僅僅是要寫入時快,不考慮查詢情況..那當然直接把C/C++的數據結構給保存了最快..
比如保存一個struct Record,或class Record,限定好成員大小後,直接內存到磁碟的寫盤...
這樣寫最快,而讀取只能順序讀取....

另json等是交換格式不是存儲格式更不能當資料庫用哇....

Ⅳ 如何用多線程讀取大文件並且做數據處理,100

先說幾個要點:

a、文件在操作系統級,有描述符標記,關聯到打開的文件表項,文件表項紀錄了一個很重要的信息,當前文件的指針;
b、cpu要乾的工作比讀文件快不,讀一次文件的速度要慢於cpu處理一次的速度,沒必要多多線程,多線程提升不了多少性能,還增加編程的難度,單線程處理即可。
c、待處理文件,必須知道一定的邊界值,如分頁邊界或單條紀錄邊界。
有了上面的前提,每個線程維護單獨的緩沖區,緩存區大小就是c點提到的邊界紀錄大小。線程啟動,把緩沖區讀滿,處理數據。此處有個要點,必須做文件鎖,把要讀的邊界鎖住。否則讀出來的數據會產生混亂。(如果強行打開多個不同的文件不劃算,內存佔用可能會過多)。產生混亂的原因簡單,讀文件實際上是進行系統調用,系統調用有自己的緩沖區,這緩沖區未必跟你設置的緩沖區一樣大。多次讀多次移動指針,不加文件鎖處理的數據必定會亂。
文件鎖兩種方式加鎖,對整個文件加鎖,對位元組區間加鎖。都不是什麼難事。
實現方式1:對整個文件加鎖,因為我們要保證的是讀到的數據別混亂。
實現方式2:如果內存足夠大,維護n個獨立的文件描述符,這些文件描述符必須有獨立的文件指針,操作系統上有對應實現。每個線程操作未讀紀錄,這么做還需要維護共享的已讀紀錄指針。防止重復處理。這么做處理完成如果需要按順序合並文件是難點。處理過的數據有新的紀錄邊界。要視實際情況而定能不能這么做。寫程序要優先保證的是正確性,之後才是提升效率。
我說的理論,依據是操作系統提供的api處理。別的語言要依賴操作系統運行。原理差不多,目標語言有沒有操作系統提供的api強悍。依據使用的目標語言而定。絕大多數能叫編程語言的語言都會提供操作系統api對應的方法。(腳本語言例外,如shell,perl,javascript,vbscript,就可能沒這么強的控制能力。),java,objective-c,swift,php,python一般是不會有問題的。

Ⅳ Linux C 怎麼實現兩個線程同步讀取兩個內存的數據

在Linux系統中使用C/C++進行多線程編程時,我們遇到最多的就是對同一變數的多線程讀寫問題,大多情況下遇到這類問題都是通過鎖機制來處理,但這對程序的性能帶來了很大的影響,當然對於那些系統原生支持原子操作的數據類型來說,我們可以使用原子操作來處理,這能對程序的性能會得到一定的提高。那麼對於那些系統不支持原子操作的自定義數據類型,在不使用鎖的情況下如何做到線程安全呢?本文將從線程局部存儲方面,簡單講解處理這一類線程安全問題的方法。

一、數據類型
在C/C++程序中常存在全局變數、函數內定義的靜態變數以及局部變數,對於局部變數來說,其不存在線程安全問題,因此不在本文討論的范圍之內。全局變數和函數內定義的靜態變數,是同一進程中各個線程都可以訪問的共享變數,因此它們存在多線程讀寫問題。在一個線程中修改了變數中的內容,其他線程都能感知並且能讀取已更改過的內容,這對數據交換來說是非常快捷的,但是由於多線程的存在,對於同一個變數可能存在兩個或兩個以上的線程同時修改變數所在的內存內容,同時又存在多個線程在變數在修改的時去讀取該內存值,如果沒有使用相應的同步機制來保護該內存的話,那麼所讀取到的數據將是不可預知的,甚至可能導致程序崩潰。
如果需要在一個線程內部的各個函數調用都能訪問、但其它線程不能訪問的變數,這就需要新的機制來實現,我們稱之為Static memory local to a thread (線程局部靜態變數),同時也可稱之為線程特有數據(TSD: Thread-Specific Data)或者線程局部存儲(TLS: Thread-Local Storage)。這一類型的數據,在程序中每個線程都會分別維護一份變數的副本(),並且長期存在於該線程中,對此類變數的操作不影響其他線程。如下圖:

二、一次性初始化
在講解線程特有數據之前,先讓我們來了解一下一次性初始化。多線程程序有時有這樣的需求:不管創建多少個線程,有些數據的初始化只能發生一次。列如:在C++程序中某個類在整個進程的生命周期內只能存在一個實例對象,在多線程的情況下,為了能讓該對象能夠安全的初始化,一次性初始化機制就顯得尤為重要了。——在設計模式中這種實現常常被稱之為單例模式(Singleton)。Linux中提供了如下函數來實現一次性初始化:
#include <pthread.h>

// Returns 0 on success, or a positive error number on error
int pthread_once (pthread_once_t *once_control, void (*init) (void));
利用參數once_control的狀態,函數pthread_once()可以確保無論有多少個線程調用多少次該函數,也只會執行一次由init所指向的由調用者定義的函數。init所指向的函數沒有任何參數,形式如下:
void init (void)
{
// some variables initializtion in here
}
另外,參數once_control必須是pthread_once_t類型變數的指針,指向初始化為PTHRAD_ONCE_INIT的靜態變數。在C++0x以後提供了類似功能的函數std::call_once (),用法與該函數類似。使用實例請參考https://github.com/ApusApp/Swift/blob/master/swift/base/singleton.hpp實現。

Ⅵ c語言文件讀寫 多線程

主線程讀的是A文件,次線程寫的是B文件,兩者不沖突。4K的buffer已經算很小了。重點是主次線程共享的數據需要做同步,所以才造成了要等待的現象。你說的類似消費者和生產者模型。

Ⅶ C#多線程寫資料庫

首先對資料庫(尤其是Access)使用多線程大多不會提高效率(除非SQL中有耗時但不好資源的操作,如T-SQL中休眠之類的語句)。
建議樓主:使用隊列,將要執行的SQL語句放入隊列中(如:System.Collection.Queue或ArrayList),然後用一根線程一條一條執行,另外Access不支持事物回滾只有自己想辦法實現了。濫用多線程會加大程序開發的難度,以及包括程序的不穩定。
另外:cbyvft的答案「……所有的線程使用同一個連接」
,是嚴重錯誤的!!連接對象Connection不能迸發,也就是不能多根線程共享一個連接對象,否則很容易引發異常(報錯為:...基礎對象與RAW分離之類的信息)。
若非要用多線程來做,我可以給你一段代碼(我以前開發的項目中一部分),請加我的「網路Hi」並發消息給我,我傳給你。
我不在這里帖代碼了,因為實現的代碼較多,而且比較復雜(使用多線程要考慮很多問題,代碼要碩壯通用,所以代碼量較大)。

Ⅷ C語言怎樣實現多線程

首先你要有控制蛇移動方向的全局變數(定義在main以外因為線程函數也要調用它,每次鍵盤輸入都會修改它的值), 比如 char direction 'a' ==左 'w' == 右 'd'==上 's' == 下,然後你在移動時應該是在while裡面操作的吧,你每移動一步前都讀一下direction這個變數的數值然後再控制移動方向(注意s這個鍵可以忽略因為不會倒著走) 然後你可以用pthread.h這個庫 例子是 pthread t;// 定義一個線程 pthread_create(&t, null, listen_keyboard_input, null);//建立線程執行listen_keyboard_input這個函數 這個線程執行的函數 void listen_keyboard_input(){ while(應該通過某個信號來退出這個循環,從而表示游戲結束){ direction =getchar(); } } 但是這里存在同步問題, 比如當這個線程的getchar()在給direction輔助的同時,你控制貪吃蛇移動的線程正在調用 direction的值來判斷下一個移動方向,這就會出問題,所以要加一個鎖,叫 mutex lock;這個也定義成全局變數可以使各線程共享。 pthread_mutex_t mutex; //定義一個鎖 pthread_mutex_init(&mutex, null, null);//初始化 然後把函數修改成 void listen_keyboard_input(){ while(應該通過某個信號來退出這個循環,從而表示游戲結束){ pthread_mutex_lock(&mutex); direction =getchar(); pthread_mutex_unlock(&mutex); } } 另外一個控制貪吃蛇移動的時候也要加鎖 while(.....){ char c; pthread_mutex_lock(&mutex); c = direction; pthread_mutex_unlock(&mutex); switch(c){ ................ } ................................... } 這樣就好了 注意你的控制貪吃蛇移動的部分也必須要放在另外一個pthread 裡面執行,如果放在主線程, 主線程會一直等listen_keyboard_input而什麼事都不會做 你把這兩個線程用 pthread_create 創建完成後 用 t1.join(); t2.join(); 就可以使這兩個線程並發執行了 如果你用的是linux 來編譯的,你再輸入gcc 指令後加上 -lpthread 就可以了 還有什麼不懂的你可以多找找 pthread 類的例子

Ⅸ C# 多線程 大量數據實時接收\解析\存儲 問題

1、定義兩個線程安全的隊列(System.Collections.Concurrent.ConcurrentQueue<T>)a跟b,其中a用於儲存接受的數據,b用於儲存要持久化的數據。
2、線程A循環讀取數據並儲存到隊列a中。
3、線程B循環從隊列a中讀取數據。
3.1、如果讀取到數據
3.1.1、將解析前的數據跟解析後的數據賦值給專門儲存它們的類c。
3.1.2、將類c添加到隊列b中。
3.1.3、將解析後的數據顯示到UI線程中。
3.2、如果沒有讀取到數據,則sleep一定時間。
4、線程C循環從隊列b中讀取數據。
4.1、如果讀取到數據,則儲存數據。
4.2、如果沒有讀取到數據,則sleep一定時間。
5、線程D可以不要,不過假設數據的處理時間過長,將導致隊列長度不斷增長,所以線程D可以循環判斷隊列a跟隊列b的長度。假設隊列中的對象數量超過特定閥值,則進行一定處理。比如終止程序,比如跳過部分數據,比如停止接收數據等。