與64位機的第一次親密接觸

2021-08-23 14:47:55 字數 1547 閱讀 7698

今天陽光明媚,我與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...