c 語(yǔ)言的 宏 是自動(dòng)根據(jù)值來(lái)確定類型的??
宏是不帶類型信息的, 只是preprocessor的一個(gè)文本替換的, 與之相對(duì)的c++的模板則帶有類型信息.
請(qǐng)問(wèn) 宏 的實(shí)際應(yīng)用價(jià)值是什么??
簡(jiǎn)單的說(shuō), 就是文本替換, 只不過(guò)基于文本替換可以玩出來(lái)些花樣.
#define max(a,b) ((a)<(b)?(b):(a)), 可以傳int, float等等, 你可以理解為支持了重載, 也可以理解為支持了泛型, 雖然很丑陋233. 再舉個(gè)不那么常見的:#define MAKE_PAIR(T) \
typedef struct MAKE_PAIR##T{ \
T first; \
T second; \
} ##T##_pair
MAKE_PAIR(char);
MAKE_PAIR(int);
MAKE_PAIR(float);
這樣就直接定義了多個(gè)類型的pair. 也是對(duì)泛型的模擬.
我感覺(jué)他和 變量 的作用是一樣的..,而且相比變量感覺(jué)由于沒(méi)有聲明數(shù)據(jù)類型,在使用上更加不方便...
就是不方便呀, 而且不只是缺乏類型, 更重要的是它的scope是dynamic scope, 而不是大家所熟知的lexical scope, 前者的name lookup是在調(diào)用處尋找, 而后者則是在定義處. 這有時(shí)候會(huì)造成混亂.
能不用的時(shí)候就別用
回復(fù)OP的疑問(wèn): 你給的這兩個(gè)鏈接的說(shuō)法都不對(duì). inline這個(gè)keyword和語(yǔ)義inline本身無(wú)關(guān), 你添加了inline其實(shí)不會(huì)對(duì)編譯器有什么影響. 編譯器有自己的判斷. c的inline是c99開始出現(xiàn)的, 貌似是學(xué)c++的. c語(yǔ)言的odr(或者說(shuō)c其實(shí)是沒(méi)有odr的, 這里只是代指那套規(guī)則)我不是很熟悉, 不過(guò)在c++里面inline關(guān)鍵詞的作用就是屏蔽odr檢查. 和inline的語(yǔ)義(內(nèi)聯(lián))沒(méi)有任何關(guān)系. 泛型的話也別看百度百科, 里面問(wèn)題一大堆. 多搜英文資料. 或者寫寫c++的模板就知道了. 上面那個(gè)pair應(yīng)該還是很容易看出泛型在c里面的應(yīng)用的. 不只是primitive type, 其實(shí)你自己的結(jié)構(gòu)體也可以這樣很輕松的做出搞出來(lái)pair.
合法。不合理。data1可能不會(huì)是你預(yù)想中的數(shù)據(jù)
常量區(qū),屬于常量字符串。
inspect只是為了查看容器里面的值的時(shí)候用的,你這里沒(méi)有調(diào)用,當(dāng)然也不會(huì)執(zhí)行
你可以查一下vue單文件組件,這也是項(xiàng)目中最常使用的組件組織形式。
在C++里使用C庫(kù)的函數(shù)時(shí),你加了 extern "C" { } 嗎? 否則就會(huì)鏈接找不到。
今天把Vue的代碼和jQuery的代碼分開成兩個(gè)<script>,好像好了
在form上加上onsubmit="return false;"解決了,原來(lái)這個(gè)報(bào)錯(cuò)不是
$.ajax({
type: "POST",。。。。
導(dǎo)致的
函數(shù)呼叫, invoke/call, 就是你調(diào)用函數(shù)的那個(gè)語(yǔ)句.
函式宣告, 即declaration, 與definition相對(duì), 前者是后者的超集, 所以每一個(gè)definition都是一個(gè)declaration, 而definition不一定是declaration:
簡(jiǎn)而言之, definition是definition的超集, definition是declaration的子集, 所以是one definition ruler, 而不是one declaration ruler
標(biāo)準(zhǔn)約定std::thread構(gòu)造時(shí)向函數(shù)對(duì)象傳遞實(shí)際參數(shù)的拷貝(支持移動(dòng)語(yǔ)義),而不是轉(zhuǎn)發(fā)實(shí)際參數(shù)(你可以通過(guò)打印實(shí)際參數(shù)和形式參數(shù)的地址來(lái)檢測(cè)這一行為)。即fun的形式參數(shù)是被a的拷貝初始化的,所以形式參數(shù)a并不是main函數(shù)內(nèi)a的引用,在fun內(nèi)賦值自然不會(huì)改變main函數(shù)內(nèi)a的值。
如果你希望“以引用的方式傳參”,常用解決方案之一是使用std::ref,即std::thread(fun, std::ref(a));。
如 sserver 日志所示
15 E0403 17:24:39.589262 4886 Utils.cc:221] unable to request data from: https://127.0.0.1/get_user_id_list?last_id=0, error: Couldn't connect to server
16 E0403 17:24:39.589727 4886 StratumServer.cc:480] http get request user list fail, url: https://127.0.0.1/get_user_id_list?last_id=0
17 E0403 17:24:39.589777 4886 StratumServer.cc:547] update user list failure
18 E0403 17:24:39.589867 4886 StratumServer.cc:776] fail to setup server
19 F0403 17:24:39.589912 4886 StratumServerMain.cc:171] init failure
參考 sserver.cfg 的注釋,你需要自己搭建一個(gè)網(wǎng)站服務(wù)器(xx.yy),并提供一個(gè)網(wǎng)站接口(/get_user_id_list),然后把網(wǎng)址寫入 sserver.cfg 文件的 list_id_api_url 項(xiàng),如下
users = {
list_id_api_url = "http://xx.yy/get_user_id_list";
};
你可以在本機(jī)搭建一個(gè) apache 或者 nginx 服務(wù)器,然后按照
https://github.com/btccom/btc...
上的說(shuō)明操作便可。
強(qiáng)引用計(jì)數(shù)(uses)為0時(shí)會(huì)析構(gòu)對(duì)象,弱引用計(jì)數(shù)(weaks)為0時(shí)會(huì)刪除ref counter對(duì)象,所以創(chuàng)建shared_ptr都會(huì)有一個(gè)uses和一個(gè)weaks
答案來(lái)了。
const axios = require('axios')
// 下面代碼發(fā)送一個(gè)post請(qǐng)求到一個(gè)服務(wù)器
axios.post('驗(yàn)證驗(yàn)證碼的目標(biāo)url', {
telephone: "17202345234" // 帶上手機(jī)號(hào)參數(shù)
})
.then(function (response) { // 后端處理成功,給你返回一個(gè)驗(yàn)證碼數(shù)據(jù),數(shù)據(jù)通過(guò)response讀取
console.log(response.testnumber);
return axios.post('獲取驗(yàn)證碼成功再發(fā)送一次請(qǐng)求的地址',{
password: "我是密碼",
telephone: "17202345234",
noteinfo: "我是備注"
})
})
.then(function(res){
//完成注冊(cè)了
console.log("注冊(cè)完成");
})
.catch(function (error) { // 如果請(qǐng)求失敗就走這里了
console.log(error);
});打開藍(lán)牙的HCI log ,抓取hci log 看看通訊情況 ,hci log 可以用 wireshark 軟件查看 hci log文件一般會(huì)保存SD卡目錄下,也有的手機(jī)保持其他路徑,可以找 /etc下的藍(lán)牙配置文件查看保持路徑
可重入鎖不是這么用的,一般是在面向?qū)ο笾惺褂?,比?/p>
class A:
def f1(self):
mutex.acquire()
try:
#do something
finally:
mutex.release()
def f2(self):
mutex.acquire()
try:
#do something
finally:
mutex.release()
def run1(obj):
obj.f1()
obj.f2()
def run2(obj):
obj.f2()
obj.f1()
obj1 = A()
t1 = threading.Thread(target=run1, args=(obj1, ))
t2 = threading.Thread(target=run2, args=(obj1, ))
t1.start()
t2.start()
調(diào)用順序不同,而且都需要同步的時(shí)候,如果不用遞歸鎖,會(huì)死鎖。如果f1或f2不加鎖,數(shù)據(jù)不同步,報(bào)錯(cuò)
if (!file)
{
cout << "文件打開失敗" << endl;
}
for (int i = 0; i < t; i++)
{
file.write((char*)&book[i], sizeof(book[i]));
}
這里打開文件, 你的程序仍然會(huì)嘗試執(zhí)行for里面的內(nèi)容, 就會(huì)導(dǎo)致指針錯(cuò)誤了. 應(yīng)該是在退出后 不但要結(jié)束while循環(huán), 還應(yīng)該退出函數(shù), 不應(yīng)該繼續(xù)執(zhí)行while后面的語(yǔ)話.
說(shuō)下自己的理解,供參考。假設(shè)題主了解網(wǎng)絡(luò)編程和計(jì)算機(jī)系統(tǒng)的一些基本概念。
簡(jiǎn)單概括來(lái)說(shuō),事件驅(qū)動(dòng)是實(shí)現(xiàn)并發(fā)處理的一種方式。
我們就以HTTP請(qǐng)求的處理過(guò)程為例,為簡(jiǎn)化說(shuō)明,僅考慮網(wǎng)絡(luò)IO,不考慮文件IO和數(shù)據(jù)庫(kù)等其他過(guò)程,也不考慮多核系統(tǒng)。
考慮采用如下最簡(jiǎn)模型來(lái)處理HTTP請(qǐng)求:
main_loop:
accept()
recv()
parse()
send()
close()
來(lái)一個(gè)連接,讀取數(shù)據(jù)(請(qǐng)求),解析請(qǐng)求內(nèi)容,返回?cái)?shù)據(jù)(應(yīng)答)。
同一時(shí)間只為一個(gè)客戶端服務(wù)。在為A客戶端服務(wù)的過(guò)程中,B客戶端必須等待。
這種方式非常簡(jiǎn)單直接,容易理解,但其無(wú)法滿足現(xiàn)實(shí)場(chǎng)景的需要——不支持并發(fā)。
現(xiàn)實(shí)中,客戶端的請(qǐng)求是并發(fā)的:即當(dāng)一個(gè)客戶端的請(qǐng)求還在處理時(shí),另外一個(gè)客戶端的請(qǐng)求就會(huì)達(dá)到,甚至多個(gè)客戶端的請(qǐng)求同時(shí)達(dá)到。
而且,recv 和 send等涉及網(wǎng)絡(luò)操作的API由于網(wǎng)絡(luò)數(shù)據(jù)發(fā)送與到達(dá)的不確定性,可能需要等待,CPU會(huì)空閑下來(lái)——但這種模型下即使CPU空閑了也無(wú)法處理其他客戶端的請(qǐng)求,浪費(fèi)了CPU。
我們采用如下多線程模型,可以解決上述問(wèn)題:
main_loop:
accept()
start_thread(thread_loop)
thread_loop:
recv()
parse()
send()
close()
exit thread()
即每個(gè)客戶端在一個(gè)獨(dú)立的線程中處理。
當(dāng)一個(gè)客戶端的線程執(zhí)行網(wǎng)絡(luò)操作需要等待時(shí),會(huì)被操作系統(tǒng)調(diào)度出去,執(zhí)行其他需要干活兒的線程。
似乎完美了解決了我們的問(wèn)題?
然而并沒(méi)有。
因?yàn)椴僮飨到y(tǒng)創(chuàng)建線程的開銷是比較大的,能夠支持的線程數(shù)量是有限的,通常是幾萬(wàn)的級(jí)別,如果線程太多,就會(huì)有很多的CPU浪費(fèi)在了線程的創(chuàng)建、銷毀、調(diào)度等管理操作上。
所以為了充分發(fā)揮CPU的能力,支持更多的并發(fā)數(shù)量,,在Linux上有另外一種處理并發(fā)的方式:
內(nèi)核提供了監(jiān)聽大量網(wǎng)絡(luò)連接(句柄)可讀、可寫等事件的機(jī)制和接口。
應(yīng)用把需要監(jiān)聽對(duì)象以及關(guān)心的事件注冊(cè)給內(nèi)核,內(nèi)核在有事件達(dá)到時(shí)通知應(yīng)用處理。
基于這種機(jī)制處理并發(fā)就是事件驅(qū)動(dòng)。
事件驅(qū)動(dòng)機(jī)制的基本模型是:
create_listen_socket()
register_event_for_listen_socket()
main_loop:
wait_for_event()
check_events:
if listen_socket has event(new client coming) :
accept()
register_event_for_client_socket()
if client_socket has event(new data coming):
recv()
parse()
send()
但這里有一個(gè)問(wèn)題,有可能一個(gè)客戶端剛讀取了一部分?jǐn)?shù)據(jù),就沒(méi)了,剩下的還在網(wǎng)絡(luò)中沒(méi)過(guò)來(lái),需要繼續(xù)等待。
這就需要把當(dāng)前的讀取內(nèi)容和請(qǐng)求處理狀態(tài)(也即上下文)保存起來(lái),繼續(xù)處理其他客戶端的事件。
然后下次這個(gè)客戶端再有事件到來(lái)時(shí)再找回上下文繼續(xù)處理。
這其實(shí)需要應(yīng)用自己做一些任務(wù)調(diào)度相關(guān)的上下文保存和切換工作。
當(dāng)使用多線程處理并發(fā)時(shí),操作系統(tǒng)幫我們做了這些工作,我們無(wú)需關(guān)心任務(wù)切換。
因?yàn)橐粋€(gè)線程就只處理一個(gè)客戶端,反復(fù)調(diào)用recv把一個(gè)請(qǐng)求的數(shù)據(jù)讀完然后解析處理就可以了,也不用擔(dān)心沒(méi)數(shù)據(jù)到來(lái)時(shí),recv阻塞了其他客戶端的處理。
所以多線程編寫并發(fā)代碼非常簡(jiǎn)單直接。
如上,事件驅(qū)動(dòng)機(jī)制是Linux上解決并發(fā)問(wèn)題的一種高效編程模型。
應(yīng)用反復(fù)探測(cè)事件,對(duì)接收到的事件進(jìn)行逐個(gè)處理的過(guò)程就是事件循環(huán)。
那么同步和異步概念體現(xiàn)在哪里呢?
所謂同步就是我們執(zhí)行一個(gè)任務(wù),一直等待任務(wù)執(zhí)行結(jié)束。
所謂異步就是我們執(zhí)行一個(gè)任務(wù),不等待任務(wù)執(zhí)行結(jié)束,繼續(xù)去干其他活兒,任務(wù)結(jié)果后有個(gè)通知,或者干脆不關(guān)心任務(wù)的執(zhí)行結(jié)果。
在多線程模型中,每接收到一個(gè)新的客戶端就創(chuàng)建一個(gè)線程處理,這就是一種異步處理。
在事件驅(qū)動(dòng)模型中,當(dāng)沒(méi)有數(shù)據(jù)可讀時(shí),就把這個(gè)客戶端繼續(xù)放到監(jiān)聽隊(duì)列中監(jiān)聽,也是一種異步。
如果我們考慮文件IO,把IO請(qǐng)求丟給另外一個(gè)或一組線程(線程池)處理,處理完后通知主線程,也是一種異步。
路徑改成
val bankText = sc.textFile("file:\\D:/Projects/Zeppelin/bank/bank-full.csv")
應(yīng)該用celery起異步任務(wù)做
你這樣同時(shí)發(fā)送三個(gè)請(qǐng)求到一個(gè)接口,真的是太耗費(fèi)網(wǎng)絡(luò)資源了。請(qǐng)求接口,網(wǎng)絡(luò)連接,接口響應(yīng) 都需要時(shí)間。
我覺(jué)得,你可以跟后端開發(fā)商量,添加一種傳參方式。
目前,你傳的是單個(gè)對(duì)象,你可以讓后端添加一種傳遞數(shù)組的方式,數(shù)組里包含 N 個(gè)你想獲取的數(shù)據(jù)參數(shù)。
(手機(jī)打字,有問(wèn)題請(qǐng)回復(fù)我......)
CURLOPT_SSL_VERIFYPEER 新版php中默認(rèn)是2
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。