1. 程式人生 > >pthread_create()建立執行緒最大個數

pthread_create()建立執行緒最大個數

執行緒應用程式最常見導致建立執行緒失敗的原因是執行緒棧大小的設定。建立一個新的執行緒,預設情況下系統為執行緒棧預留了2MB的定址空間。執行緒棧起始於程序虛擬 記憶體的高階地址,並向虛擬記憶體底端地址方向擴充套件。取決於執行緒本身的大小以及其它執行緒記憶體分配的情況,程序虛擬地址空間消耗過快可能導致建立執行緒失敗。

這裡有一個測試程式可以看到,Linux下最多可以建立多少個執行緒。

#include <pthread.h>

#include <stdio.h>

#include <string.h>

void *ThreadFunc()

{

    static int count = 1;

    printf ("Create thread%d/n", count);

    pthread_detach(pthread_self());

    count++;

}

main(void)

{

    int     err;

    pthread_t tid;

    while (1){

           err= pthread_create(&tid, NULL, ThreadFunc, NULL);

           if(err != 0){

               printf("can't create thread: %s/n",strerror(err));

           break;

           }  

    }

}

輸出結果如下:

Create thread 301

Create thread 302

can't create thread: Cannot allocate memory

 ulimit -s 可以檢視到棧的預設大小為10240K

32linux下的程序使用者空間是3072M 3072/10.24=300。為什麼實際會比計算出來的多2個,這個原因還不太清楚。(編者注:準確演算法是(3072*1024K)/10240K=307.2,實際會比計算出來的少5.2個)

可以在呼叫pthread_create 的時候用 pthread_attr_getstacksize 

設定棧的大小,或者直接用 ulimit -s 設定棧的大小。

如果修改上面的測試程式碼為

#include <pthread.h>

#include <stdio.h>

#include <string.h>

void *ThreadFunc()

{

    static int count = 1;

    printf ("Create thread%d/n", count);

    pthread_detach(pthread_self());

    count++;

}

main(void)

{

    int     err;

    pthread_t tid;

    while (1){

           err= pthread_create(&tid, NULL, ThreadFunc, NULL);

           if(err != 0){

               printf("can'tcreate thread: %s/n", strerror(err));

           break;

           }  

    }

}

那麼得到的結果將是:

Create thread 560000

Create thread 560001

……………

這裡用到了pthread_detach(pthread_self())來釋放執行緒所佔用的記憶體資源(執行緒核心物件和執行緒堆疊)。這樣就可以建立更多的執行緒,而不會出現Cannot allocate memory的錯誤。

如果程序中的某個執行緒執行了pthread_detach(th),則th執行緒將處於DETACHED狀態,這使得th執行緒在結束執行時自行釋放所佔用的記憶體資源。一個可join的執行緒所佔用的記憶體僅當有執行緒對其執行了pthread_join()後才會釋放,因此為了避免記憶體洩漏,所有執行緒的終止,要麼已設為DETACHED,要麼就需要使用pthread_join()來回收

相關推薦

pthread_create()建立執行個數

執行緒應用程式最常見導致建立執行緒失敗的原因是執行緒棧大小的設定。建立一個新的執行緒,預設情況下系統為執行緒棧預留了2MB的定址空間。執行緒棧起始於程序虛擬 記憶體的高階地址,並向虛擬記憶體底端地址方向擴充套件。取決於執行緒本身的大小以及其它執行緒記憶體分配的情況,程序虛

C++用pthread_create()建立執行時需要注意的問題

pthread_create()是Linux中建立執行緒的一種方式。 #include<pthread.h> int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*star

java建立執行簡單的方式

在開發專案中,偶爾會用到執行緒,眾所周知,執行緒有2種建立方式:繼承Thread類和實現Runnable介面,具體實現過程如下一,繼承Thread類,過程如下:(1)定義Thread類的子類,並重寫父類的run()方法,方法裡的內容就是執行緒所要執行的任務; (2)建立子類的

執行pthread_create建立執行

pthreads定義了一套C程式語言型別、函式、與常量。以pthread.h和一個執行緒庫實現。 資料型別: pthread_t:執行緒控制代碼 pthread_attr_t:執行緒屬性 執行緒操作函式: pthread_create():建立一個執行緒 pthread_e

建立執行:CreateThread與pthread_create引數比較

建立執行緒 在 Windows 中,您可以使用 CreateThread() 來建立執行緒,建立的執行緒在呼叫程序的虛擬地址空間中執行。 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD SIZE_T d

一個程序多可以建立執行的數目

1,在x86平臺32位系統,系統佔用2GB地址空間,使用者方式2GB。如果使用VS,連結程式開關/SACK 或者/F可以設定執行緒堆疊大小,預設分配一個執行緒的堆疊大小是1MB,當CreateThread引數的StackSize大小與連結程式設定的不一致時,採用的方法是誰

根據機器核心個數建立執行

ExecutorService es= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2); 執行緒池大小建議為核心個數得兩倍

【Linux學習】pthread_create執行建立的新執行之間退出關係

我們在一個執行緒中經常會建立另外的新執行緒,如果主執行緒退出,會不會影響它所建立的新執行緒呢?下面就來討論一下。 1、  主執行緒等待新執行緒先結束退出,主執行緒後退出。正常執行。 例項程式碼: #include "apue.h" #include <pthread

hbase建立預切割-開啟多執行實現批量插入

建立表同時預切割區域 可以防止資料傾斜 ------------------$hbase>create 'ns1:t3', 'f1', SPLITS => ['row3000000', '

使用pthread_create建立大量執行時,建立執行失敗,Resource temporarily unavailable的解決辦法

        今天在一個測試程式中使用pthread_create建立了大量執行緒,但是如果執行緒數量增加到400後,就會出現執行緒建立失敗,perror打印出的錯誤原因是:Resource temporarily unavailable。        在網上查了下,原

hdu6006 Engineer Assignment 狀態dp 定義dp[i][s]表示前i個工程狀態為s可以執行工程數。s表示前i個工人選走了s狀態的工程師。

namespace algo acm names .cn num stream assign target /** 題目:hdu6006 Engineer Assignment 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=60

Thread的thread1.join(),thread1.join(int milliseconds)方法:把執行thread1加入到當前執行(多等待milliseconds毫秒)

thread.Join把指定的執行緒加入到當前執行緒,可以將兩個交替執行的執行緒合併為順序執行的執行緒。 比如線上程B中呼叫了執行緒A的Join()方法,直到執行緒A執行完畢後,才會繼續執行執行緒B。 t.join();      //呼叫join方法,等

Java建立執行的方法

轉載自:https://www.cnblogs.com/3s540/p/7172146.html   Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用三種方式來建立執行緒,如下所示: 1)繼承Thread類建立執行緒 2)實現Runn

jvm之java建立執行導致記憶體異常

1。以下執行緒啟動,請注意儲存當前工作,因為jav的執行緒是對映到作業系統的核心執行緒上,下面程式碼執行,容易導致作業系統假死 會導致部署程式碼的缺失,執行以上程式會導致如下結果如: 請強制結束以下程序。 分析如下: java的執行緒執行是對映到作業系統的核心執行緒上的。

JAVA多執行10個執行處理1000個數

import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import j

java建立執行的四種方法(轉)

java中建立執行緒的四種方法以及區別 Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用四種方式來建立執行緒,如下所示: 1)繼承Thread類建立執行緒 2)實現Runnable介面建立執行緒 3)使用Callable和Future建立執行緒

spring4+ThreadPoolTaskExecutor建立執行 兩種方式傳送郵件

百度雲程式碼下載地址包含測試用例 :點選後跳轉 ThreadService package com.konglingfu.service; public interface ThreadService extends Runnable{ public void se

匿名內部類建立執行的兩種方式

我們知道多執行緒的實現有兩種方式,一種是繼承Thread類,另一種是實現Runnable介面,然後再重寫run方法,最後開啟執行緒。我們在普通的建立執行緒中,顯然是比較麻煩的,那麼有沒有一個簡單的方法呢?今天小錢就給大家介紹使用匿名內部類建立執行

Qt 筆記:另一種建立執行的方式

class QThread :public Qt { // ....... // ....... protected: virtual void run() = 0; // ....... // ....... }; ps:面向物件程式設計實踐的早起,

C#:執行(2):建立執行

一:建立新執行緒 在C#裡,執行緒是一種已經定義好的類,其被定義在System.Threading名稱空間內,因此建立新執行緒和我們例項化物件並沒有本質的差別。在這裡,用一個最簡單的例子說明如何建立新執行緒。 (一):建立新的控制檯程式,在控制檯程式的主函式下面,寫一個希望在新執行緒中呼叫的