編譯軟體調線程
① VC++6.0編譯器中怎麼設置編譯選項為多線程
/MT
「Project Settings」
選擇「C/C++」頁面標簽,然後在「Category」下拉式清單方塊中選擇「Code Generation」。在「Use Run-Time Library」下拉式清單方塊中,可以看到用於「Release」設定的「Single-Threaded」和用於Debug設定的「Debug Single-Threaded」。將這些分別改為「Multithreaded」和「Debug Multithreaded」。
② C語言編譯器是否支持多線程
C語言編譯器有很多,只要不是太舊的都支持多線程。C語言本身是沒有多線程的概念的,都是操作系統提供支持,所以不同操作系統中的多線程實現起來可能完全不一樣。
③ tomcat編譯對多線程的支持怎麼樣
最佳線程數:
性能壓測的情況下,起初隨著用戶數的增加,QPS會上升,當到了一定的閥值之後,用戶數量增加QPS並不會增加,或者增加不明顯,同時請求的響應時間卻大幅增加。這個閥值我們認為是最佳線程數。
為什麼要找最佳線程數
1.過多的線程只會造成,更多的內存開銷,更多的CPU開銷,但是對提升QPS確毫無幫助
2.找到最佳線程數後通過簡單的設置,可以讓web系統更加穩定,得到最高,最穩定的QPS輸出
最佳線程數的獲取:
1、通過用戶慢慢遞增來進行性能壓測,觀察QPS,響應時間
2、根據公式計算:伺服器端最佳線程數量=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu數量
3、單用戶壓測,查看CPU的消耗,然後直接乘以百分比,再進行壓測,一般這個值的附近應該就是最佳線程數量。
影響最佳線程數的主要因素:
1、IO
2、CPU
根據公式:伺服器端最佳線程數量=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu數量
一般來說是IO和CPU。IO開銷較多的應用其CPU線程等待時間會比較長,所以線程數量可以開的多一些,相反則線程數量要少一些,其實有兩種極端,純IO的應用,比如proxy,則線程數量可以開到非常大(實在太大了則需要考慮線程切換的開銷),這種應用基本上後端(比如這個proxy是代理搜索的)的QPS能有多少,proxy就有多少。
另一種是耗CPU的計算,這種情況一般來講只能開到CPU個數的線程數量。但是並不是說這種應用的QPS就不高,往往這種應用的QPS可以很高。
QPS和線程數的關系
1、在最佳線程數量之前,QPS和線程是互相遞增的關系,線程數量到了最佳線程之後,QPS持平,不在上升,甚至略有下降,同時相應時間持續上升。
2、同一個系統而言,支持的線程數越多(最佳線程數越多而不是配置的線程數越多),QPS越高
QPS和響應時間的關系
1、對於一般的web系統,響應時間一般有CPU執行時間+IO等待時間組成
2、CPU的執行時間減少,對QPS有實質的提升,IO時間的減少,對QPS提升不明顯。如果要想明顯提升QPS,優化系統的時候要著重優化CPU消耗大戶。
最佳線程數和jvm堆內存得關系:
以上都是依據性能瓶頸在CPU的情況,對於java應用還有一個因素是FULL GC,我們要保證在最佳線程數量下,不會發生頻繁FULL GC
根據公式::(小GC時間間隔/rt)*(並發線程數量 * thm) <=young 計算得到的並發線程數量如果<最佳線程數量 則可能導致FULL GC較頻繁,實際情況看來這種情況在web系統上非常少。不過可以模擬出來。
所以我們在設置jboss線程的時候,可以利用內存公式計算出來的線程數量來設置,通過壓測和計算得到最佳線程數,然後設置線程數。
設置線程數量:
壓測最佳線程數<真實設置的線程數量<內存極限線程數
比如,通過壓測得到某系統的最佳線程數量是10,然後通過內存計算的線程數量是20,則,設置jboss的線程數量為15是可行的,如果直接設置了10,由於系統本身會受到一些依賴系統的變化而產生一些變化,比如系統依賴一些IO的響應時間會突然延長,由於線程數量還是10,其實這個時候最佳線程數量已經變成了13了,由於我們設置死了10,其結果就是導致qps下降,但是如果超過20,則又會引起FULL gc非常頻繁,反過來影響QPS的下降。
jboss的線程數設置:
對於jboss而言,設置線程數量要看使用了那種線程連接,如http、ajp等
http和ajp的設置是完全一樣的,非常簡單:
以ajp為例,找到server.xml或者tomcat-server.xml:
默認線程數量是200個
<Connector port="8009" address="${jboss.bind.address}" connectionTimeout="15000" protocol="AJP/1.3" maxThreads="200" minSpareThreads="40" maxSpareThreads="75" maxPostSize="512000" acceptCount="300" bufferSize="16384" emptySessionPath="false" enableLookups="false" redirectPort="8443" useBodyEncodingForURI="true"/>
這里將默認的線程數量改成了20,當然相應的其他最小空閑線程數和最大空閑線程數也做一下調整:
<Connector port="8009" address="${jboss.bind.address}" connectionTimeout="15000" protocol="AJP/1.3" maxThreads="20" minSpareThreads="20" maxSpareThreads="20" maxPostSize="512000" acceptCount="300" bufferSize="16384" emptySessionPath="false" enableLookups="false" redirectPort="8443" useBodyEncodingForURI="true"/>
④ 新人求教.Perl怎麼編譯能支持多線程,要加什麼配置選項嗎
perl是cgi程序的一種,多線程需要你寫多線程代碼,然後才是編譯問題,如果程序本身寫的不是多線程的,編譯也沒有,因為根本和編譯無關。
⑤ gcc如何調試多線程程序
gcc如何調試多線程程序
在gcc編譯時加上-lpthread參數,用以連接到庫文件。且加上-g參數,用以支持gdb調試。
例如gcc test.c -o -g test -lpthread
會得到可執行文件test
而後使用gdb對可執行文件test進行調試
gdb test
b 行號 :設置斷點
clear 行號:清楚斷點
info 行號:查看斷點
run:進入到下一個斷點(執行函數體)
stpe:進入到下一個斷點(不執行函數體)
infothread:查看被調試的線程
⑥ 為什麼有時編譯選項要改成多線程才能編譯通過,而 單線程就不行呢
主要是libc(C函數)庫不同,有時鏈接時會看到libcd.lib/libc.lib/libcmt.lib...這些東東,就是針對不同的線程環境所使用的。不過在VS2005之後,不再使用單線程庫了,它只使用libc*mt.lib,也就是有很多老程序代碼在VS2005下找不到LIBCD.lib的原因。
如果你在程序中使用了_beginthread之類的函數,那麼就會鏈接到多線程的c函數庫,單線程選項當然不能使用了。
而使用FORCE:MUTIPLE和這個沒有多大關系,它可能在同時使用了單線程庫和多線程庫時起到了忽略多個重疊符號錯誤的作用。
⑦ C語言如何實現多線程同時運行
1、點擊菜單欄的「Project」選項卡,下拉列表的最後一項「Project options...」是對當前工程的的屬性進行設置的。
⑧ linux C語言 makefile編譯、關閉線程、開啟線程怎麼做
線程跟makefile沒有關系
用fork或者pthread_* api來使用進程和線程
⑨ 編譯器如何處理多線程程序
這是一個多線程例子,裡面只有兩個線程,是生產者/消費者模式,已編譯通過,注釋很詳細,
如下:
/* 以生產者和消費者模型問題來闡述Linux線程的控制和通信你
生產者線程將生產的產品送入緩沖區,消費者線程則從中取出產品。
緩沖區有N個,是一個環形的緩沖池。
*/
#include <stdio.h>
#include <pthread.h>
#define BUFFER_SIZE 16
struct prodcons
{
int buffer[BUFFER_SIZE];/*實際存放數據的數組*/
pthread_mutex_t lock;/*互斥體lock,用於對緩沖區的互斥操作*/
int readpos,writepos; /*讀寫指針*/
pthread_cond_t notempty;/*緩沖區非空的條件變數*/
pthread_cond_t notfull;/*緩沖區未滿 的條件變數*/
};
/*初始化緩沖區*/
void pthread_init( struct prodcons *p)
{
pthread_mutex_init(&p->lock,NULL);
pthread_cond_init(&p->notempty,NULL);
pthread_cond_init(&p->notfull,NULL);
p->readpos = 0;
p->writepos = 0;
}
/*將產品放入緩沖區,這里是存入一個整數*/
void put(struct prodcons *p,int data)
{
pthread_mutex_lock(&p->lock);
/*等待緩沖區未滿*/
if((p->writepos +1)%BUFFER_SIZE ==p->readpos)
{
pthread_cond_wait(&p->notfull,&p->lock);
}
p->buffer[p->writepos] =data;
p->writepos++;
if(p->writepos >= BUFFER_SIZE)
p->writepos = 0;
pthread_cond_signal(&p->notempty);
pthread_mutex_unlock(&p->lock);
}
/*從緩沖區取出整數*/
int get(struct prodcons *p)
{
int data;
pthread_mutex_lock(&p->lock);
/*等待緩沖區非空*/
if(p->writepos == p->readpos)
{
pthread_cond_wait(&p->notempty ,&p->lock);//非空就設置條件變數notempty
}
/*讀書據,移動讀指針*/
data = p->buffer[p->readpos];
p->readpos++;
if(p->readpos == BUFFER_SIZE)
p->readpos = 0;
/*設置緩沖區未滿的條件變數*/
pthread_cond_signal(&p->notfull);
pthread_mutex_unlock(&p->lock);
return data;
}
/*測試:生產站線程將1 到1000的整數送入緩沖區,消費者線程從緩沖區中獲取整數,兩者都列印信息*/
#define OVER (-1)
struct prodcons buffer;
void *procer(void *data)
{
int n;
for( n=0;n<1000;n++)
{
printf("%d ------>\n",n);
put(&buffer,n);
}
put(&buffer,OVER);
return NULL;
}
void *consumer(void *data)
{
int d;
while(1)
{
d = get(&buffer);
if(d == OVER)
break;
else
printf("----->%d\n",d);
}
return NULL;
}
int main()
{
pthread_t th_p,th_c;
void *retval;
pthread_init(&buffer);
pthread_create(&th_p,NULL,procer,0);
pthread_create(&th_c,NULL,consumer,0);
/*等待兩個線程結束*/
pthread_join(th_p, &retval);
pthread_join(th_c,&retval);
return 0;
}
⑩ 伺服器編譯軟體的線程數多少最合適
簡單的理解為用戶端與伺服器端僅僅只有一座橋梁,數據傳送只能靠這一座橋梁來完成。我們可以把這個橋梁當作是線程。線程數的多少會影響到下載速度的多少但是不一定是開到最大就是最好的要根據服務端和用戶端的具體情況而定