今天陽光明媚,我與64位有個約會。
約會內容如下:
首先,main中建立producer和consumer兩個執行緒,然後等待兩個執行緒執行完畢。
理論上講,螢幕上依次會輸出
point 1
point 2
point 3
unfortunately,**在列印出point 2後segment fault core掉了,我將兩個pthraed_join()交換位置,變成下面的樣子:
fprintf(stderr,"point 2/n");
pthread_join(consumer, (void *)&result);
fprintf(stderr, "point 1/n");
pthread_join(producer, (void *)&result);
這次居然沒有core。。。莫非,pthread_join和pthread_create還有順序對應關係?不應該呀!man pthread_join看了下,沒有相關注意事項,那麼,有點囧了……
考慮到我是在實驗室,莫非……莫非……於是在**前面加了這麼一句:
printf("int size: %d, void* size:%d/n", sizeof(int), sizeof(void*));
****!輸出為:
int size: 4
void* size: 8
囧,問題找到~原來這是個64位機器,int 和pointer的大小不一樣了。
堆疊layout如下:
main args hi
pthread_t producer
pthread_t consumer
intresult lo
第乙個pthread_join會向result所在的堆疊處寫資料(這裡為全0),資料長度為8位元組,於是乎,consumer的內容被破壞了,後面的pthread_join使用的consumer指標也就變成非法了。core之~~
如何避免這個問題呢?最自然的方法就是改變result的定義:
long result;
long和void*都是佔8位元組。
還有個搞著玩的方法,僅僅這段**中適用,那就是改變consumer和producer的定義順序:
pthread_t consumer;
pthread_t producer;
為什麼呢?呼叫pthread_join()等待producer,返回後producer的內容會被result覆蓋掉,恰好producer再也不會被使用了,壞了也就壞了。但是consumer還健在,下乙個pthread_join照常執行。經過驗證,ok~這個道理跟上面交換兩個pthread_join的順序是相通的。
我養的太陽花還沒見發芽,然而那一盆土上已經長出了五顏六色的草兒,每天清晨趴在床頭看一看,也是十分的賞心悅目呢~~
與64位機的第一次親密接觸
今天陽光明媚,我與64位有個約會。約會內容如下 首先,main中建立producer和consumer兩個執行緒,然後等待兩個執行緒執行完畢。理論上講,螢幕上依次會輸出 point 1 point 2 point 3 unfortunately,在列印出point 2後segment fault c...
與MySQL第一次親密接觸
資料庫的好處 1 可以持久化資料到本地 2 結構化查詢 資料庫的常見概念 1 db 資料庫 儲存資料的容器 2 dbms 資料庫管理系統,又稱為資料庫軟體或資料庫產品,用於建立或者管理db 3 sql 結構化查詢語言,用於和資料庫通訊的語言,不是某個資料庫軟體特有的,而是幾乎所有的主流的資料庫軟體通...
RabbitMQ的第一次親密接觸
企業應用系統,如果系統之間的通訊 整合與整合,尤其當面臨異構系統時,那麼需要分布式的呼叫與通訊。系統中一般會有很多對實時性要求不高但零零碎碎且耗時的地方,比如傳送簡訊,郵件提醒,記錄使用者操作日誌等,在使用者訪問量比較大的情況下,對系統壓力比較大。面對這些問題,我們一般會將這些請求,放在訊息佇列mq...