亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 59780 | 回復: 60
打印 上一主題 下一主題

[Linux] Linux系統(tǒng)開發(fā)那點事兒 分享經驗得牛人力作!(獲獎名單已公布-2014-5-28) [復制鏈接]

論壇徽章:
1
天蝎座
日期:2013-12-06 18:23:58
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-04-08 20:24 |只看該作者 |倒序瀏覽
獲獎名單已公布,詳情請看:http://www.72891.cn/thread-4140163-1-1.html

話題背景

Linux系統(tǒng)編程想必大家都已不陌生,高手眾多,不過有些坎,即使高手也難逃一劫,前仆后繼的被絆一跤!跋到y(tǒng)編程”是指編寫系統(tǒng)軟件,其代碼在底層運行,直接跟內核和核心系統(tǒng)庫對話。比如說Linux系統(tǒng)調用和底層函數(shù)說明,如C庫定義的函數(shù)。作為基礎,系統(tǒng)程序員需要對Linux文件系統(tǒng)、I/O、緩存、進程、內存都有了解,要想成為大家則需精通。大家可以聊聊自己在開發(fā)過程中遇見的各種詭異的情景,奇葩的錯誤,比如api的使用死角,例如syslog傳入的數(shù)據沒有對%進行轉義,內存爆棧,網絡洪水,自己把自己DDOS打死;等等各種印象深刻的事情。

今日話題:

        1. 系統(tǒng)開發(fā)中遇見的那些頭疼的問題
        2. 系統(tǒng)開發(fā)過程中的收獲
        3. 如何做好Linux 系統(tǒng)開發(fā)


活動時間:

2014-4-8至2014-5-15

活動獎勵:

我們將會選擇幾位突出的網友贈送一本常讀常新的書籍《Linux系統(tǒng)編程》第二版,作者是大名鼎鼎Robert Love
這個作者可是非常有名,Google的高級工程師,寫的書質量極高,書雖然不厚,內容卻都是干貨
Linux系統(tǒng)編程經典之作,根據Linux內核3.0更新 !
Linux程序設計方面的傳奇人物Robert Love力作 !

獎品簡介:
Linux系統(tǒng)編程(第2版)

作者: (美)Robert Love   
譯者: 祝洪凱 李妹芳 付途
出版社:人民郵電出版社
ISBN:9787115346353
上架時間:2014-4-18
出版日期:2014 年4月
開本:16開
頁碼:420

圖書樣張:
g前言.DOC (5.47 MB, 下載次數(shù): 70)
f序.DOC (28.5 KB, 下載次數(shù): 42)
d譯者序.DOC (29.5 KB, 下載次數(shù): 43)
h目錄.DOC (82 KB, 下載次數(shù): 71)


01入門和概念.zip (1.7 MB, 下載次數(shù): 169)
01入門和概念.z01 (5 MB, 下載次數(shù): 149)
(樣張文件需要兩個都要下載解壓才能打開)






論壇徽章:
208
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉雞
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午馬
日期:2013-10-25 21:22:48技術圖書徽章
日期:2013-11-01 09:11:32雙魚座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32酉雞
日期:2013-12-04 19:56:39
2 [報告]
發(fā)表于 2014-04-09 09:35 |只看該作者
問題倒多,可惜大部分是自己的問題

論壇徽章:
0
3 [報告]
發(fā)表于 2014-04-09 10:13 |只看該作者
我遇到的這個問題其實應該不算個問題,但在我剛開始學多線程編程的時候卻困擾了我很久,在網上也沒找到答案,或者說沒有直接的答案,后來是自己去讀了部分nptl源代碼后才明白原因,雖然費時很多,但也收獲良多。
問題很簡單,就是關于線程取消的操作,在某種情況下,線程不管怎樣都不能退出,問題肯定是出在鎖上,但始終找不到死鎖的地方,先帖段代碼:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <pthread.h>

  4. pthread_mutex_t lock;
  5. pthread_cond_t cond;
  6. void thrd_cleanup()
  7. {
  8.         printf("thread canceled\n");

  9.         pthread_mutex_unlock(&lock);
  10. }

  11. void thrd_func()
  12. {
  13.         pthread_cleanup_push(thrd_cleanup, NULL);
  14.         printf("thread: enter\n");
  15.         pthread_mutex_lock(&lock);
  16.         pthread_cond_wait(&cond, &lock);
  17.         pthread_mutex_unlock(&lock);
  18.         pthread_cleanup_pop(0);
  19.         printf("thread: exit\n");
  20. }

  21. int main(int argc, char *argv[])
  22. {
  23.         pthread_t tid[4];

  24.         pthread_mutex_init(&lock, NULL);
  25.         pthread_cond_init(&cond, NULL);

  26.         for (int i = 0; i < 4; ++i) {
  27.                 int ret = pthread_create(&tid[i], NULL, thrd_func, NULL);
  28.                 if (ret) {
  29.                         perror("pthread_create");
  30.                 }
  31.         }

  32.         sleep(3);

  33.         pthread_mutex_lock(&lock);

  34.         for (int i = 0; i < 4; ++i) {
  35.                 printf("before cancel\n");
  36.                 pthread_cancel(tid[i]);
  37.                 pthread_join(tid[i], NULL);
  38.                 printf("after cancel\n");
  39.         }

  40.         pthread_mutex_unlock(&lock);

  41.         sleep(6);

  42.         return 0;
  43. }
復制代碼
上面代碼得到的輸出為
  1. thread: enter
  2. thread: enter
  3. thread: enter
  4. thread: enter
  5. before cancel
復制代碼
可見在第一個線程退出的時候出了問題,一開始就幾乎可以肯定是鎖這出了問題,可一直找不到原因,attach該進程,得到的結果為
  1. (gdb) bt
  2. #0  0xb772f424 in __kernel_vsyscall ()
  3. #1  0xb7707e1c in pthread_join () from /lib/i386-linux-gnu/libpthread.so.0
  4. #2  0x080489f4 in main (argc=1, argv=0xbfe68a24) at main.c:67
復制代碼
可見,程序在調用pthread_join后阻塞了,再查看當前進程中的線程:
  1. (gdb) info threads
  2.   Id   Target Id         Frame
  3.   4    Thread 0xb6d52b40 (LWP 5658) "foo" 0xb772f424 in __kernel_vsyscall ()
  4.   3    Thread 0xb6551b40 (LWP 5659) "foo" 0xb772f424 in __kernel_vsyscall ()
  5.   2    Thread 0xb5d50b40 (LWP 5660) "foo" 0xb772f424 in __kernel_vsyscall ()
  6. * 1    Thread 0xb75546c0 (LWP 5656) "foo" 0xb772f424 in __kernel_vsyscall ()
復制代碼
顯示已經有一個線程成功退出,而查看進程的/proc文件系統(tǒng)信息得到的卻是:
  1. $ls /proc/5656/task
  2. 5656  5657  5658  5659  5660
復制代碼
這卻說明剛才的那個線程沒有完全退出,當時我覺得這是相當詭異的,所謂百思不得其解啊,最后經過分析nptl關于pthread_cancel操作的源碼后,終于找到了原因:

我們在進入線程的時候注冊了線程清理理函數(shù),隨后進入等待狀態(tài),注意這時候主線程已經持有鎖了,并調用pthread_cancel和pthread_join,這個時候nptl的實現(xiàn)中需要再次持有該鎖,這時候問題就出現(xiàn)了,主線程持有鎖并等待pthread_join的結束,而nptl庫需要先拿到鎖才能返回,這就永遠不會結束,導致上面的問題。

經過這個問題之后,覺得多線程編程真是個頭疼的問題,稍有不甚就會出現(xiàn)各種詭異的問題,尤其對于初學者,經驗不足,解決起這些問題是費時費力又不一定有效果。

評分

參與人數(shù) 1可用積分 +2 收起 理由
crazyhadoop + 2 有鎖的情形下就要考慮到各種情形了,稍不留.

查看全部評分

論壇徽章:
17
戌狗
日期:2013-09-02 23:43:02技術圖書徽章
日期:2014-04-29 14:16:02技術圖書徽章
日期:2014-04-24 15:51:26未羊
日期:2014-04-06 22:10:30丑牛
日期:2014-04-06 21:23:29辰龍
日期:2014-04-06 21:20:22處女座
日期:2014-04-06 21:16:18技術圖書徽章
日期:2014-04-02 15:10:51金牛座
日期:2014-03-10 22:26:18巨蟹座
日期:2014-02-17 17:12:12技術圖書徽章
日期:2014-01-24 10:38:43摩羯座
日期:2013-11-29 18:00:18
4 [報告]
發(fā)表于 2014-04-09 10:55 |只看該作者
支持活動,好活動探討linux開源系統(tǒng)。

論壇徽章:
0
5 [報告]
發(fā)表于 2014-04-09 10:59 |只看該作者
1. 系統(tǒng)開發(fā)中遇見的那些頭疼的問題
   多線程, 用pthread的時候, 棧開小了, 出了錯是panic 吧.
   tcp/ip 數(shù)據同步出問題, x86到power時, 映射數(shù)據會有大小端轉換

2. 系統(tǒng)開發(fā)過程中的收獲
   解決方案沒把握時, 一定要寫個demo來驗證一下.

論壇徽章:
0
6 [報告]
發(fā)表于 2014-04-09 13:37 |只看該作者
最大的坑就是那個著名的 a.out,一定要./a.out才可以執(zhí)行。有多少初學者, gcc hello.c一次寫對編譯成功并執(zhí)行成功的?

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
7 [報告]
發(fā)表于 2014-04-09 13:47 |只看該作者
mmap失敗返回的不是想當然的NULL,而是MAP_FAILED(-1)

論壇徽章:
11
技術圖書徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
8 [報告]
發(fā)表于 2014-04-09 14:27 |只看該作者
回復 3# 阿注哥
分析NPTL源碼解決問題,很強大!
個人使用多線程時恪守兩個原則:
1. “thread is evil”,能不用就不用。Linux/UNIX下,多線程比多進程的優(yōu)勢并沒有教科書理論闡釋的那么美好,不過多線程確實可以簡化共享數(shù)據結構的實現(xiàn),看看多進程五花八門的IPC就知道了。
2. 使用簡單的核心API,少用高大上。理解mutex/condition variable/semaphore API就可以解決多數(shù)問題,當想用push/pop/cancel等等偏門API時,反省自己的代碼架構,通?梢员苊庵。

   

論壇徽章:
0
9 [報告]
發(fā)表于 2014-04-09 14:49 |只看該作者
回復 8# timespace


    linux的線程用輕量進程實現(xiàn),實則區(qū)別不大,記得看過一篇文章,詳細介紹其區(qū)別,也說了沒特別的必要性就盡量避免!那么花了我好多時間才搞明白,算是印象深刻的一次經歷了。

論壇徽章:
0
10 [報告]
發(fā)表于 2014-04-10 09:15 |只看該作者
做C語言開發(fā)有一段時間了,我的一些經驗分享給大家:

1 C就是C,不要在C中實現(xiàn)try ... catch, 如果實在避不開,用一下setjmp longjunp,不建議大量使用,多用if做判斷更好

2 C就是C,不要在C中試圖實現(xiàn)類似C++/Java等語言中的類,C嗎?簡單點更好

3 內存管理,如果不能簡單到每次申請大小都是固定長度字節(jié)的內存,那就別自己管理內存了,有更好的工具可以使用,比如:Google Performance Tools
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP