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

  免費注冊 查看新帖 |

Chinaunix

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

[其他] 多線程如何才能等待任務(wù)執(zhí)行完成才停止 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-05-24 13:00 |只看該作者 |倒序瀏覽
假設(shè)總共有5個線程,其中4個在read中,另一個正在處理任務(wù)。

這時候需要停止系統(tǒng)做更新操作等,我希望程序的停止是在這個線程任務(wù)處理完成后才正常停止。如何做?謝謝啦~~~~

pthread_cancel只要發(fā)送信號到線程了,線程接收到就退出了,那么就會造成有些任務(wù)只處理到一半。。。

論壇徽章:
0
2 [報告]
發(fā)表于 2013-05-24 13:10 |只看該作者
現(xiàn)在想的是,如果自己在做任務(wù),然后就去注冊一下。感覺麻煩,pthread_cancel能解決嗎

論壇徽章:
0
3 [報告]
發(fā)表于 2013-05-24 13:10 |只看該作者
現(xiàn)在想的是,如果自己在做任務(wù),然后就去注冊一下。感覺麻煩,pthread_cancel能解決嗎

論壇徽章:
0
4 [報告]
發(fā)表于 2013-05-24 13:14 |只看該作者
可以手動設(shè)置線程退出的時機。
通過 int pthread_setcanceltype(int type, int *oldtype)
設(shè)置本線程取消動作的執(zhí)行時機,type由兩種取值:PTHREAD_CANCEL_DEFFERED和 PTHREAD_CANCEL_ASYNCHRONOUS,僅當Cancel狀態(tài)為Enable時有效,分別表示收到信號后繼續(xù)運行至下一個取消點再退出和 立即執(zhí)行取消動作(退出);oldtype如果不為NULL則存入運來的取消動作類型值。
此函數(shù)應(yīng)該在線程開始時執(zhí)行,若線程內(nèi)部有任何資源申請等操作,應(yīng)該選擇 PTHREAD_CANCEL_DEFFERED 的設(shè)定,然后在退出點(pthread_testcancel 用于定義退出點)進行線程退出。
void pthread_testcancel(void)
檢查本線程是否處于Canceld狀態(tài),如果是,則進行取消動作,否則直接返回。 此函數(shù)在線程內(nèi)執(zhí)行,執(zhí)行的位置就是線程退出的位置,在執(zhí)行此函數(shù)以前,線程內(nèi)部的相關(guān)資源申請一定要釋放掉,他很容易造成內(nèi)存泄露。

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
5 [報告]
發(fā)表于 2013-05-24 13:14 |只看該作者
我還沒碰到過要用 pthread_cancel 的場合。

這函數(shù)設(shè)計出來算一種bug嗎?

論壇徽章:
0
6 [報告]
發(fā)表于 2013-05-24 13:22 |只看該作者
我大致理解你的運用場景了。一般通用的做法是這樣的:
在新線程的入口程序里面通常會有如下代碼段:

while(sys_state != SYS_SHUT_DOWN)
{
           if(hasJobs())
           {
            //here process you jobs
           }
           else
            {
               sleep(nnnnn);//等著任務(wù)的到來
            }

接下來的代碼就是函數(shù)返回及線程退出之前的資源回收了
一般都不會主動使用thread_cancel來結(jié)束線程。線程執(zhí)行的代碼段結(jié)束了,它自己會退出的,你只需要考慮什么時候讓它的代碼段結(jié)束就行了。

論壇徽章:
0
7 [報告]
發(fā)表于 2013-05-24 15:02 |只看該作者
回復(fù) 4# foolishx

#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void *thread(void* m)
{
        pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL);     //??????
       // pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); //??????
        pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); //??????
        unsigned long  t,id;
        t = *(unsigned long *)m;
        while(1)
        {
                printf("thread %ld\n",pthread_self()); //??????
                sleep(3);
//                pthread_testcancel();
        }
}




int main()
{
        pthread_t t[2];
        pthread_attr_t at;
        int ret, i;
        for(i = 0; i < 2;i++)
        {
                ret = pthread_create(&t,NULL,thread,&i);
                if(ret!=0)
                {
                        printf ("Create pthread error!n");
                        exit (1);
                }
printf("%ld\n", t);




        }
        while(1){
//                pthread_cancel(t[0]); //10???,???????. t??????
//                pthread_cancel(t[1]); //10???,???????. t??????
                sleep(10);
                pthread_cancel(t[1]); //10???,???????. t??????
                pthread_cancel(t[0]); //10???,???????. t??????
        }
}




現(xiàn)在感覺很奇怪




測試代碼如上,   如果我給線程1,2都發(fā)送了cancel信號,但是由于線程中沒有cancel點,所以一直卡在,但為什么printf的都沒有打了呢?








如果我在線程1,2都加上pthread_testcancel(),線程沒有正常退出,線程也沒有打印printf的內(nèi)容




如果主線程只給一個線程發(fā)送cancel信號,則無論有沒有pthread_testcancel() 線程都會退出一個。。。。




   

論壇徽章:
0
8 [報告]
發(fā)表于 2013-05-29 14:38 |只看該作者
本帖最后由 foolishx 于 2013-05-29 14:39 編輯

回復(fù) 7# korpus

先說說你代碼里存在的問題:
int main()
{
        pthread_t t[2];
        pthread_attr_t at;
        int ret, i;
        for(i = 0; i < 2;i++)
        {
                ret = pthread_create(&t ,NULL,thread,&i);
                if(ret!=0)
                {
                        printf ("Create pthread error!n");
                        exit (1);
                }
printf("%ld\n", t);




        }
        while(1){
//                pthread_cancel(t[0]); //10???,???????. t??????
//                pthread_cancel(t[1]); //10???,???????. t??????
                sleep(10);
                pthread_cancel(t[1]); //10???,???????. t??????
                pthread_cancel(t[0]); //10???,???????. t??????
        }
}
由于上述代碼存在的問題,會導致你丟失了第一個線程的id,于是之后所有對于線程1的操作都將沒有辦法準確的進行,同時對于t[1]的操作將是不可知的結(jié)果 。修正之后再看看問題如何   

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
9 [報告]
發(fā)表于 2013-06-14 17:50 |只看該作者
korpus 發(fā)表于 2013-05-24 13:00
假設(shè)總共有5個線程,其中4個在read中,另一個正在處理任務(wù)。

這時候需要停止系統(tǒng)做更新操作等,我希望程 ...

pthread_join();
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP