誰かがUbuntu 14.04.3 LTS x86_64にCUDA 7.5を正常にインストールしましたか?


12

私のワークステーションには2つのGPU(Quadro K5200およびQuadro K2200)があり、最新のNVIDIAドライバーがインストールされています(バージョン:352.41)。CUDA 7.5 Downloadscuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.debからファイルをダウンロードした後、インストールしようとしましたが、結果は次のようになりました。

root@P700-Bruce:/home/bruce/Downloads# sudo apt-get install cuda
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 cuda : Depends: cuda-7-5 (= 7.5-18) but it is not going to be installed
 unity-control-center : Depends: libcheese-gtk23 (>= 3.4.0) but it is not going to be installed
                        Depends: libcheese7 (>= 3.0.1) but it is not going to be installed
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.

私は解決策を試しました:

  1. sudo apt-get remove nvidia-cuda-* #古いnvidia-cudaパッケージを削除
  2. 満たされていない依存関係をインストールします。

    root@P700-Bruce:/home/bruce/Downloads# apt-get install cuda-7-5
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Some packages could not be installed. This may mean that you have
    requested an impossible situation or if you are using the unstable
    distribution that some required packages have not yet been created
    or been moved out of Incoming.
    The following information may help to resolve the situation:
    
    The following packages have unmet dependencies:
     cuda-7-5 : Depends: cuda-toolkit-7-5 (= 7.5-18) but it is not going to be installed
                Depends: cuda-runtime-7-5 (= 7.5-18) but it is not going to be installed
     unity-control-center : Depends: libcheese-gtk23 (>= 3.4.0) but it is not going to be installed
                            Depends: libcheese7 (>= 3.0.1) but it is not going to be installed
    E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
    
    root@P700-Bruce:/home/bruce/Downloads# apt-get install cuda-toolkit-7-5
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Some packages could not be installed. This may mean that you have
    requested an impossible situation or if you are using the unstable
    distribution that some required packages have not yet been created
    or been moved out of Incoming.
    The following information may help to resolve the situation:
    
    The following packages have unmet dependencies:
     cuda-toolkit-7-5 : Depends: cuda-core-7-5 (= 7.5-18) but it is not going to be installed
                        Depends: cuda-command-line-tools-7-5 (= 7.5-18) but it is not going to be installed
                        Depends: cuda-samples-7-5 (= 7.5-18) but it is not going to be installed
                        Depends: cuda-documentation-7-5 (= 7.5-18) but it is not going to be installed
                        Depends: cuda-visual-tools-7-5 (= 7.5-18) but it is not going to be installed
     unity-control-center : Depends: libcheese-gtk23 (>= 3.4.0) but it is not going to be installed
                            Depends: libcheese7 (>= 3.0.1) but it is not going to be installed
    E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
    
  3. aptitudeをインストールして使用する

Ubuntu14.04 OSがインストールされたばかりで、ソフトウェアの更新が行われ、最新のNvidiaドライバーがインストールされました。

助けてもらえますか?前もって感謝します!

回答:


8

CUDAのインストールには少し注意が必要です。私は次の手順を実行しましたが、うまくいきます。このリンクも参照できます。

環境の確認:

  1. lspci | grep -i nvidia (NVIDIAのボードの情報が表示されていることを確認してください)

  2. uname -m (x86_64であることを確認してください)

  3. gcc --version (インストールされていることを確認してください)

CUDAのインストール–

  1. https://developer.nvidia.com/cuda-downloadscuda_7.5.18_linux.runからファイルをダウンロードします

  2. 次のコマンドを実行します。

    sudo apt-get install build-essential
    echo blacklist nouveau option nouveau modeset=0 |sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf 
    sudo update-initramfs -u
    
  3. コンピューターを再起動する

  4. ログイン画面で、Ctrl+ Alt+ F1を押してユーザーにログインします。

  5. CUDAドライバーがあるディレクトリに移動して、実行します

    chmod a+x .
    sudo service lightdm stop
    sudo bash cuda-7.5.18_linux.run --no-opengl-libs
    
  6. インストール中:

    • EULA条件に同意する
    • NVIDIAドライバーのインストールにYESと答えます
    • CUDA Toolkit + DriverのインストールにYESと答えます
    • CUDAサンプルのインストールにYESと答えます
    • NvidiaでXserver構成を再構築しないでください
  7. /dev/nvidia*ファイルが存在するかどうかを確認してください。そうでない場合は、以下を実行します

    sudo modprobe nvidia
    
  8. 環境パス変数を設定する

    export PATH=/usr/local/cuda-7.5/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
    
  9. ドライバーのバージョンを確認する

    cat /proc/driver/nvidia/version`
    
  10. CUDAドライバーのバージョンを確認する

    nvcc –V
    
  11. lightdmを再びオンに切り替えます

    sudo service lightdm start
    
  12. Ctrl+ Alt+ F7およびGUI経由でシステムにログイン

  13. CUDAサンプルを作成し、NVIDIA_CUDA-7.5_Samplesターミナルからフォルダーに移動して、次のコマンドを実行します。

    make
    cd bin/x86_64/linux/release/
    ./deviceQuery
    ./bandwidthTest
    

    両方のテストは最終的にターミナルで「PASS」を出力する必要があります

  14. システムを再起動します


どうもありがとう!これは私のAsus UX32VD(GeForce 620Mを搭載したOptimusラップトップ)で最終的に動作します。私はすべてを試しました。昨日、numble-352をBumblebeeで動作させることができましたが、CUDAツールキットをインストールした後、サンプルを実行できませんでした(CUDAカードを持っていなかったかのように、はい、使用していましたoptirun)。他のドライバーが私をログインループまたはブラックに誘導しましたunity-greeter!私はあなたに十分に感謝することはできません:)
Maghoumi

私はここで変更する必要があると唯一のものはからだったoptionoptionsブラックリストヌーボーセクション内。
TheM00s3

NVIDIA GeForce GTX 680を搭載したHPデスクトップを使用しています。実行ファイル(cuda_7.5.18_linux.run)に付属のグラフィックカードドライバーがlightdm再起動後に動作を停止することを除き、ほとんどの命令は機能しました(grub後、無限に点滅するカーソルのある黒い画面が表示されます) )。私の解決策は、最初にそのドライバーをアンインストールしsudo apt-get purge nvidia-*、NVIDIA公式ウェブサイトからダウンロードした最新の実行ファイルを使用してインストールすることでした。そして、それは完全に機能します。代替ソリューションは、溶液(A)のようなものになるだろうaskubuntu.com/a/676772/194156

2

適切なCUDAドライバーをインストールする方法は2つあります(Optimusおよびハイブリッドメインボードの組み込みグラフィックスチップセット用)-ここで説明する最初の方法が最も簡単で、2番目の説明はより煩雑ですが効果的です:

A)

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-355 nvidia-prime
sudo reboot

B)

方法Bの説明はここにありますが、すでに古くなっています(ユーザーdschinn1001による説明)-この方法Bはより謙虚で危険な場合がありますが、有害ではありません。:

Ubuntu13.04にNvidia Driver GT 520およびCuda 5.0をインストールするにはどうすればよいですか?

Linux用にダウンロードするNvidiaのベータ版ドライバーパッケージは次のとおりです。

http://www.nvidia.de/object/cuda_1_1_beta.html

メソッドAはより簡単ですが、明確ではありませんが、xscreensaverとメソッドBの相互作用の方法は古いですが、ドライバーパッケージも最近更新されており、メソッドBの実行後、xscreensaverが条件付けられたxscreensaverでより良く動作するはずですインストール済み。(13.10でメソッドBをテストしましたが、これはxscreensaverでも非常に良好に機能していました。このスレッドの残りはハードウェア次第だと思います。)

さらに、Optimus-graphics-chipsetsを使用したbumblebeeに関連して、これらのbumblebeeの調整も必要です。

14.04でnVidia Optimus / Bumblebeeをセットアップする方法



1

runfileメソッドを使用してCUDAを正常にインストールしました。プライマリグラフィックスドライバー runfileメソッドを使用してインストールする必要があるため、セットアップは少し複雑です(こちらを参照)。

ドライバーだけをインストールてみてください。これは、runfileメソッドを使用して実行できます。インストールの各部分のプロンプトが表示され、GLライブラリとツールキットを無効にできます。ユニティコントロールセンターは、のlibGLU.so代わりにCUDAサンプルを使用する必要があるため、私にも問題を与えていますlibGL.so。これは、独自の学習例を構築するときに簡単に修正できます。


1

nvidiaドライバーをアンインストールし、それなしでcudaを直接インストールしてみてください。新しいUbuntu 14.04で、nvidiaの Webサイトの指示に従いました。互換性のあるバージョン(gcc、カーネル)を確認する以外に、手順は次のとおりです。

sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb 
sudo apt-get update
sudo apt-get install cuda 

幸いなことに、上記の手順の副産物として正しいnvidiaドライバーがインストールされました。


1

私は丸1日、「ppa:graphics-drivers / ppa」を使用してNVIDIAドライバーをバージョン352に更新しようとしました。すべてが失敗しました。1回のインストール後、gpu-manager.logはドライバーがインストールされたことを報告しましたが、Xorg.0.logは反対を報告しました。

nouveauドライバーが削除され、ブラックリストに登録されました:sudo apt-get --purge remove xserver-xorg-video-nouveau cat /etc/modprobe.d/nouveau-nomodeset-jsrobin.conf blacklist nouveau options nouveau modeset = 0 alias nouveau off alias lbm-nouveau off

私は最終的にあきらめて、純粋に「NVIDIA ... bin」ソリューションを使用しました。

  1. 上記のように、ブラックリストに登録されたヌーボー。
  2. 上記のようにnouveau Xserverを完全にアンインストールしました。
  3. PCIe(2枚のnvidiaカード)をプライマリとして持つようにシステムBIOSを設定し、メインボードHD4600インターフェイスを無効にします。
  4. リカバリモードで起動し、ネットワークをアクティブにしてから、コンソールモードに移行しました。
  5. 「NVIDIA-Linux-x86_64-352.41.run -uninstall」を実行して、何も残っていないことを確認しました。
  6. / etc、/ usr / localの古いディレクトリを削除しました。これは、過去のcudaまたはnvidiaインストールの残骸のように見えました。
  7. ラン「NVIDIA-Linux-x86_64-352.41.run」
  8. 「NVIDIA-Linux-x86_64-352.41.run --check」を実行して、すべてが正しかったことを確認しました(正しかった)。
  9. 次に、「cuda_7.5.18_linux.run」を実行してインストールを完了します。物事は現在働いています。両方のモニターが稼働しています。現在、cudaサンプルファイルの構築に取り組んでいます。NVIDIAインストールビンで「--help」フラグを使用してください。私がbinルートに進むことを決めた主な理由は、「メサ」OpenGL更新後の「bin」アプローチが回復への簡単なルートを提供するためです。 結果

1

今日、Ubuntuをリブートしましたが、別の満たされていない依存関係libcog15 : Depends: mesa-driver...(パッケージの完全な名前を思い出せない)が見つかっapt-get installたため、「mesa-driver」をインストールしていました。その後、CUDA 7.5は正常にインストールされました。

カーネルバージョンは3.19.0-28-genericで、gccバージョンはUbuntu 4.8.4-2ubuntu1〜14.04であり、CUDA 7.5の公式ドキュメントにはないことに注意してください。本当に機能するかどうかを確認します。


1
何らかの理由で、コンピューターのメサドライバーが起動時にあらゆる種類の統一問題を引き起こし、システムの完全な障害を引き起こしました。注意してください。
asdf

@Bruce Yo-これは一般にメサの問題だけでなく、ハイブリッドnvidia-graphics-cardsのチップセットに依存しますが、これらはすべて異なっています。あなたも私のソリューションを検討する必要があります。:o)
dschinn1001

0

私はsudo apt-get install cudaの代わりにsudo suとapt-get install cudaを試しました。動いた。

 sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
 sudo apt-get update
 sudo su
 apt-get install cuda

Ask Ubuntuへようこそ。知識を共有してくれてありがとう。ただし、これはフォーラムではなく、Q&Aサイトです。このヘルプツアーを確認してください。他の回答(ユーザー661266の)を複製することは役に立ちません。十分な評判を得たら、投票することができます。
user.dz

@Sneetsherコメントありがとうございます。私は661266ユーザーの答えをしようとしましたが、うまくいきませんでした。「sudo」の代わりに「su」を使用すると、機能しました。正確な理由はわかりません。しかし、私の試用版ではうまくいきました。私のソリューションを試す間、誰かにとって価値があると信じています。
ソフトギア

0

https://github.com/astorfi/Caffe_Deep_Learning/blob/master/Installation/readme.mdを参照して ください。これは本質的にCaffeのインストールに関連していますが、CUDAのインストールにも対応しています。


1
こんにちは@ amirsani_torfi、ask.ubuntuへようこそ。リンクは、尋ねられた質問に対処するために必要な情報を提供する可能性がありますが、リンクはいつでも削除できることに注意してください。代わりに質問を編集して、そのリンクからの重要な情報を含めることをお勧めします。
Tshilidziムーダウ

-1

-lightdmログインの問題(ログインループ)

-ドライバーistallの問題(「ドライバーのインストールに失敗しました:Xサーバーが実行されているようです...」)

Ubuntu 16.04 64bitにNVidia CUDA Toolkitを正常にインストールするには、やらなければなりませんでした:

  1. ペンドライブでUbuntuのliveImageを作成します(8GBのペンで十分です)-このような試みは、ホストLinuxシステムへのインストールが失敗する前に、多くの神経節約します!!!
  2. ペンドライブのライブセッションにログインします(「インストールする前にUbuntuを試してください」)
  3. ライブセッションでsudoユーザーを追加します。

    sudo adduser admin(#pass:admin1)

    sudo usermod -aG sudo admin

  4. ライブセッションからログアウトし、#adminとしてログインします

  5. NVidia公式サイトからCUDA Toolkitをダウンロード(〜1.5GB)
  6. ダウンロードしたインストーラファイルの権限を変更します(このステップではインストールしないでください!):
    sudo chmod + x cuda_X.X.run

  7. コンソールビューに切り替えます。

    Ctr + Alt + F1(ターミナルビューをオンにする)Ctr + Alt + F7(ターミナルビューからグラフィカルサーバーに切り替える)

  8. コンソールビュー(Ctr + Alt + F1)でログイン:

    ログイン:管理者パス:admin1

  9. グラフィカル実行サービスを停止します。

    sudo service lightdm stop

  10. グラフィカルサーバーがオフになっているかどうかを確認します-Ctr + Alt + F7を切り替えた後、モニターは空白の黒になり、コンソールビューCtr + Alt + F1に戻ります。

  11. そのような構成でCUDA Toolkitをインストールします:

    sudo ./cuda_X.X.run(ライセンス読み取りスキップのために 'q'を押します)OpenGLライブラリをインストールしませんsystem X構成を更新しません

  12. グラフィカルサーバーをオンにします。

    sudoサービスlightdm start

  13. ユーザーとしてログインします(ライブセッションのログアウト時に#ubuntuとして自動的にログインする場合):

    ログイン:管理者パス:admin1

  14. GPUブロックで提供されている単純な並列ベクトル合計で動作するnvccコンパイラを確認します。

    新しいファイルにvecSum.cuとbook.hを保存し、ターミナルでコンパイルして実行します:/usr/local/cuda-8.0/bin/nvcc vecSum.cu && clear && ./a.out

  15. コンソールの印刷出力を確認します-0.000000 + 0.000000 = 0.000000のようになります

    -1.100000 + 0.630000 = -0.000000
    
    -2.200000 + 2.520000 = 0.319985
    
    -3.300000 + 5.670000 = 2.119756
    -4.400000 + 10.080000 = 5.679756
    -5.500000 + 15.750000 = 10.250000
    -6.600000 + 22.680000 = 16.017500
    -7.700000 + 30.870001 = 23.170002
    -8.800000 + 40.320000 = 31.519997
    -9.900000 + 51.029999 = 41.129967
    
  16. ペンドライブのライブセッションですべてがうまくいった場合は、ホストLinuxシステムで同じことを行います

PSそれは理想的なチュートリアルではありませんが、私にとってはうまくいくことに注意してください!

======= vecSum.cu =====

#include "book.h"
#define N 50000
///usr/local/cuda-8.0/bin/nvcc vecSum.cu && clear && ./a.out

//"HOST" = CPU
//"Device" = GPU

__global__ void add( float *a, float *b, float *c )
{
    int tid = blockIdx.x;
    if ( tid < N )
        c[ tid ] = a[ tid ] + b[ tid ];
}

int main ( void )
{
    float a[ N ], b[ N ], c[ N ];
    float *dev_a, *dev_b, *dev_c;
    //GPU memory allocation
    HANDLE_ERROR( cudaMalloc( ( void** )&dev_a, N * sizeof( float ) ) );
    HANDLE_ERROR( cudaMalloc( ( void** )&dev_b, N * sizeof( float ) ) );
    HANDLE_ERROR( cudaMalloc( ( void** )&dev_c, N * sizeof( float ) ) );

    //sample input vectors CPU generation
    for ( int i = 0; i < N; i++ )
    {
        a[ i ] = -i * 1.1;
        b[ i ] = i * i * 0.63;
    }

    //copy/load from CPU to GPU data vectors a[], b[] HostToDevice
    HANDLE_ERROR( cudaMemcpy( dev_a, a, N * sizeof( float ), cudaMemcpyHostToDevice ) );
    HANDLE_ERROR( cudaMemcpy( dev_b, b, N * sizeof( float ), cudaMemcpyHostToDevice ) );

    //calculate sum of vectors on GPU
    add<<<N,1>>> ( dev_a, dev_b, dev_c );

    //copy/load result vector from GPU to CPU c[] DeviceToHost
    HANDLE_ERROR( cudaMemcpy( c, dev_c, N * sizeof( float ), cudaMemcpyDeviceToHost ) );

    //printout results
    for ( int i = 0; i < 10; i++ ) printf( "%f + %f = %f\n", a[ i ], b[ i ], c[ i ] );

    //free memory and constructed objects on GPU
    cudaFree( dev_a );
    cudaFree( dev_b );
    cudaFree( dev_c );

    return 0;
}

========= book.h ======

/*
 * Copyright 1993-2010 NVIDIA Corporation.  All rights reserved.
 *
 * NVIDIA Corporation and its licensors retain all intellectual property and
 * proprietary rights in and to this software and related documentation.
 * Any use, reproduction, disclosure, or distribution of this software
 * and related documentation without an express license agreement from
 * NVIDIA Corporation is strictly prohibited.
 *
 * Please refer to the applicable NVIDIA end user license agreement (EULA)
 * associated with this source code for terms and conditions that govern
 * your use of this NVIDIA software.
 *
 */


#ifndef __BOOK_H__
#define __BOOK_H__
#include <stdio.h>

static void HandleError( cudaError_t err,
                         const char *file,
                         int line ) {
    if (err != cudaSuccess) {
        printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
                file, line );
        exit( EXIT_FAILURE );
    }
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))


#define HANDLE_NULL( a ) {if (a == NULL) { \
                            printf( "Host memory failed in %s at line %d\n", \
                                    __FILE__, __LINE__ ); \
                            exit( EXIT_FAILURE );}}

template< typename T >
void swap( T& a, T& b ) {
    T t = a;
    a = b;
    b = t;
}


void* big_random_block( int size ) {
    unsigned char *data = (unsigned char*)malloc( size );
    HANDLE_NULL( data );
    for (int i=0; i<size; i++)
        data[i] = rand();

    return data;
}

int* big_random_block_int( int size ) {
    int *data = (int*)malloc( size * sizeof(int) );
    HANDLE_NULL( data );
    for (int i=0; i<size; i++)
        data[i] = rand();

    return data;
}


// a place for common kernels - starts here

__device__ unsigned char value( float n1, float n2, int hue ) {
    if (hue > 360)      hue -= 360;
    else if (hue < 0)   hue += 360;

    if (hue < 60)
        return (unsigned char)(255 * (n1 + (n2-n1)*hue/60));
    if (hue < 180)
        return (unsigned char)(255 * n2);
    if (hue < 240)
        return (unsigned char)(255 * (n1 + (n2-n1)*(240-hue)/60));
    return (unsigned char)(255 * n1);
}

__global__ void float_to_color( unsigned char *optr,
                              const float *outSrc ) {
    // map from threadIdx/BlockIdx to pixel position
    int x = threadIdx.x + blockIdx.x * blockDim.x;
    int y = threadIdx.y + blockIdx.y * blockDim.y;
    int offset = x + y * blockDim.x * gridDim.x;

    float l = outSrc[offset];
    float s = 1;
    int h = (180 + (int)(360.0f * outSrc[offset])) % 360;
    float m1, m2;

    if (l <= 0.5f)
        m2 = l * (1 + s);
    else
        m2 = l + s - l * s;
    m1 = 2 * l - m2;

    optr[offset*4 + 0] = value( m1, m2, h+120 );
    optr[offset*4 + 1] = value( m1, m2, h );
    optr[offset*4 + 2] = value( m1, m2, h -120 );
    optr[offset*4 + 3] = 255;
}

__global__ void float_to_color( uchar4 *optr,
                              const float *outSrc ) {
    // map from threadIdx/BlockIdx to pixel position
    int x = threadIdx.x + blockIdx.x * blockDim.x;
    int y = threadIdx.y + blockIdx.y * blockDim.y;
    int offset = x + y * blockDim.x * gridDim.x;

    float l = outSrc[offset];
    float s = 1;
    int h = (180 + (int)(360.0f * outSrc[offset])) % 360;
    float m1, m2;

    if (l <= 0.5f)
        m2 = l * (1 + s);
    else
        m2 = l + s - l * s;
    m1 = 2 * l - m2;

    optr[offset].x = value( m1, m2, h+120 );
    optr[offset].y = value( m1, m2, h );
    optr[offset].z = value( m1, m2, h -120 );
    optr[offset].w = 255;
}


#if _WIN32
    //Windows threads.
    #include <windows.h>

    typedef HANDLE CUTThread;
    typedef unsigned (WINAPI *CUT_THREADROUTINE)(void *);

    #define CUT_THREADPROC unsigned WINAPI
    #define  CUT_THREADEND return 0

#else
    //POSIX threads.
    #include <pthread.h>

    typedef pthread_t CUTThread;
    typedef void *(*CUT_THREADROUTINE)(void *);

    #define CUT_THREADPROC void
    #define  CUT_THREADEND
#endif

//Create thread.
CUTThread start_thread( CUT_THREADROUTINE, void *data );

//Wait for thread to finish.
void end_thread( CUTThread thread );

//Destroy thread.
void destroy_thread( CUTThread thread );

//Wait for multiple threads.
void wait_for_threads( const CUTThread *threads, int num );

#if _WIN32
    //Create thread
    CUTThread start_thread(CUT_THREADROUTINE func, void *data){
        return CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, data, 0, NULL);
    }

    //Wait for thread to finish
    void end_thread(CUTThread thread){
        WaitForSingleObject(thread, INFINITE);
        CloseHandle(thread);
    }

    //Destroy thread
    void destroy_thread( CUTThread thread ){
        TerminateThread(thread, 0);
        CloseHandle(thread);
    }

    //Wait for multiple threads
    void wait_for_threads(const CUTThread * threads, int num){
        WaitForMultipleObjects(num, threads, true, INFINITE);

        for(int i = 0; i < num; i++)
            CloseHandle(threads[i]);
    }

#else
    //Create thread
    CUTThread start_thread(CUT_THREADROUTINE func, void * data){
        pthread_t thread;
        pthread_create(&thread, NULL, func, data);
        return thread;
    }

    //Wait for thread to finish
    void end_thread(CUTThread thread){
        pthread_join(thread, NULL);
    }

    //Destroy thread
    void destroy_thread( CUTThread thread ){
        pthread_cancel(thread);
    }

    //Wait for multiple threads
    void wait_for_threads(const CUTThread * threads, int num){
        for(int i = 0; i < num; i++)
            end_thread( threads[i] );
    }

#endif




#endif  // __BOOK_H__
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.