2013-02-11 34 views
0

我有興趣編寫一個能夠運行R腳本的C++程序。出於幾個設計原因,我想創建一個RInside實例,執行腳本,獲取結果並銷燬實例;全部在一個線程內。我知道R不是多線程的,並且不能創建多個RInside實例。但是我可以在獨立線程中創建單個實例嗎?當我試圖做到這一點我的代碼編譯,但我會在運行時出現以下錯誤:在線程內創建一個RInside實例

Error: C stack usage is too close to the limit 
Error: C stack usage is too close to the limit 
terminate called after throwing an instance of 'Rcpp::binding_not_found' 
    what(): binding not found: '.AutoloadEnv' 
Aborted 

這裏是產生錯誤代碼:

#include <unistd.h> 
#include <stdio.h> 
#include <pthread.h> 
#include <RInside.h> 

void *thread_main(void *args){ 

    RInside R(0,NULL); 

    /* hope to execute an R script here */ 

    printf("--printing from thread--\n"); 

    return NULL; 
} 

int main(int argc, char *argv[]){ 

    pthread_t tid; 
    if(pthread_create(&tid, NULL, thread_main, NULL)){ 
     printf("failed to create thread\n"); 
     return -1; 
    } 

    sleep(1); 

    return 0; 
} 

我已經嘗試設置R_CStackLimit = (uintptr_t)-1爲在Writing R Extension中推薦,但無濟於事。

我在運行ubuntu,R版本2.15.2,RInside版本0.2.10。

可以做到這一點嗎?還是我必須學習Rserve? 非常感謝!

回答

0

R是並將可能保持單線程。 RInside花了一些時間來確保它被創建爲一個單身人士;如果你顛覆,你會得到你在上面看到的錯誤。在同一個可執行文件中,您只能獲得一個RInside實例,因此每個線程無法工作。如你所見。

有關如何在使用多線程前端(如Qt或Web應用程序的Wt庫)時處理單線程後端請參閱源代碼中的示例。

長期來看,我們可能能夠做到Rserve所做的工作和分叉。代碼貢獻將是受歡迎的,我可能沒有時間去處理這個問題。

相關問題