新聞中心
本文轉(zhuǎn)載自微信公眾號(hào)【編程珠璣】(shouwangxiansheng)。

一個(gè)多線程進(jìn)程fork出來(lái)的進(jìn)程是多線程還是單線程的?先說(shuō)結(jié)論:是單線程的。
實(shí)踐
口說(shuō)無(wú)憑,我們先寫(xiě)段代碼實(shí)踐驗(yàn)證一下。
- // multiThread.cc
- #include
- #include
- #include
- #include
- #include
- std::atomic
start{false}; - void threadfunc() {
- while (!start) {
- std::this_thread::sleep_for(std::chrono::seconds(1));
- }
- while (start) {
- std::this_thread::sleep_for(std::chrono::seconds(1));
- std::cout << "thread func,pid:" << getpid() << std::endl;
- }
- }
- int main() {
- std::thread t1(threadfunc);
- // daemon(0, 1); // 后臺(tái)執(zhí)行
- start.store(true);
- t1.join(); // 等待threadfunc運(yùn)行結(jié)束
- return 0;
- }
編譯運(yùn)行:
- $ g++ -o multiThread multiThread.cc -lphtread
- $ ./multiThread
- thread func,pid:9901
- thread func,pid:9901
- thread func,pid:9901
結(jié)果正常,線程不斷循環(huán)打印信息。那如果啟動(dòng)線程后,再fork呢?即將代碼中daemon的相關(guān)行的注釋去掉,再編譯運(yùn)行。
運(yùn)行這個(gè)例子,我們會(huì)發(fā)現(xiàn),程序立馬退出了,沒(méi)有打印我們預(yù)想的內(nèi)容。
為什么
為什么會(huì)這樣呢?實(shí)際上,fork的時(shí)候會(huì)拷貝父進(jìn)程的數(shù)據(jù)內(nèi)容,即寫(xiě)時(shí)復(fù)制,但是,像啟動(dòng)運(yùn)行的線程,是不會(huì)被“復(fù)制”過(guò)去的。也就是說(shuō),從父進(jìn)程fork出來(lái)的子進(jìn)程,將會(huì)是單線程的。這也就給了我們一些啟示:
如果在API中需要啟動(dòng)工作線程,則工作線程需要在daemon化之后再啟動(dòng)。
怎么理解呢?比如說(shuō),你設(shè)計(jì)了某一個(gè)功能,你的功能是需要啟動(dòng)一個(gè)線程來(lái)進(jìn)程工作,那么你在使用的時(shí)候,就必須要特別注意這種fork進(jìn)程的場(chǎng)景,即需要在fork之后啟動(dòng)線程,才能保證線程能夠正常啟動(dòng)并工作。
新聞名稱:多線程進(jìn)程fork出來(lái)的進(jìn)程是單線程還是多線程?
文章路徑:http://m.5511xx.com/article/cdooids.html


咨詢
建站咨詢
