Хтось успішно встановив CUDA 7.5 на Ubuntu 14.04.3 LTS x86_64?


12

На моїй робочій станції є два графічні процесори (Quadro K5200 та Quadro K2200) із встановленим останнім драйвером NVIDIA (версія: 352.41). Завантаживши файл cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.debіз CUDA 7.5 завантажень , я намагаюся його встановити, але виходить результат, як показано нижче:

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. Встановіть і використовуйте здатність

Моя ОС Ubuntu14.04 тільки що встановлена, і вони зробили оновлення програмного забезпечення та встановили останній драйвер Nvidia.

Ви можете дати допомогу? Спасибі заздалегідь!

Відповіді:


8

Установка CUDA трохи хитра. Я дотримувався наступних кроків, і це працює на мене. Ви також можете посилатися на це посилання .

Підтвердження навколишнього середовища:

  1. lspci | grep -i nvidia (Переконайтеся, що інформація плати NVIDIA відображається)

  2. uname -m (переконайтеся, що це x86_64)

  3. gcc --version (переконайтеся, що він встановлений)

Встановлення CUDA -

  1. Завантажте cuda_7.5.18_linux.runфайл з https://developer.nvidia.com/cuda-downloads

  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
    • Скажіть ТАК, щоб встановити інструментарій CUDA + драйвер
    • Скажіть ТАК для встановлення зразків CUDA
    • Скажіть, що НЕ відновлюйте будь-які конфігурації Xserver з Nvidia
  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. Знову ввімкніть світлодіод

    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 (ноутбук Optimus з GeForce 620M). Я спробував все і все. Вчора я міг змусити nvidia-352 працювати з Bumblebee, але, встановивши інструментарій CUDA, я не зміг запустити жодного з зразків (як би у мене не було карти CUDA, і так, я використовував optirun). Інші драйвери породили мене в циклі входу або в чорний unity-greeter! Я не можу вам подякувати достатньо
:)

Єдине, що мені потрібно було змінити тут, - це optionв optionsмежах розділу чорного списку нуво.
TheM00s3

У мене на робочому столі HP з NVIDIA GeForce GTX 680. Ваша інструкція здебільшого працювала, за винятком того, що драйвер графічної картки, що постачається з файлом запуску ( cuda_7.5.18_linux.run), змушує lightdmперестати працювати після перезавантаження (після grub, ви побачите чорний екран із нескінченним миготливим курсором ). Моє рішення було спочатку видалити цей драйвер sudo apt-get purge nvidia-*і встановити його за допомогою останнього запущеного файлу, завантаженого з офіційного веб-сайту NVIDIA. І це прекрасно працює. Альтернативним рішенням було б щось на зразок рішення (A) в askubuntu.com/a/676772/194156
Xin

2

Існує два способи встановлення відповідного драйвера CUDA (для Optimus та інших вбудованих графічних чіпсетів на гібридних материнських платах) - перший, описаний тут, найпростіший, а другий опис - також громіздкіший, але й ефективний:

А)

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

Б)

Опис методу B тут, але вже старіший (пояснив користувач dschinn1001) - цей метод B є більш смиренним і може бути ризикованим, але не шкідливим. :

Як я можу встановити драйвер Nvidia GT 520 та Cuda 5.0 в Ubuntu13.04?

Пакет бета-драйверів для Nvidia для завантаження в Linux тут:

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

Метод A є більш простим, але не зрозумілим, як він взаємодіє з xscreensaver, а метод B старіший, але пакет драйверів оновлений також останнім часом, і після того, як метод B буде виконаний, він повинен краще працювати з xscreensaver, за умови, що xscreensaver є встановлено. (Я протестував метод B 13.10, і це працювало дуже добре, навіть з xscreensaver. І я думаю, що решта цього потоку залежить від обладнання.)

Окрім того, і для посилання на джмеля з Optimus-graphics-чіпсетами ці налаштування для джмеля також необхідні:

Як налаштувати nVidia Optimus / джміль в 14.04


1

Звучить як lp-помилка 1428972 .

Користувач fennytansy додав вирішення у коментарі №10 :

sudo apt-get install libglew-dev libcheese7 libcheese-gtk23 libclutter-gst-2.0-0 libcogl15 libclutter-gtk-1.0-0 libclutter-1.0-0


після запуску командний екран став чорним. я можу отримати доступ лише до tty1? Чи знаєте ви якісь інші рішення?
Кареш Арунакірінатан

1

Я успішно встановив CUDA методом runfile. Налаштування трохи складніше, оскільки ваш основний графічний драйвер також повинен бути встановлений за допомогою методу runfile ( Див. Тут ).

Спробуйте встановити лише драйвер. Це можна зробити за допомогою методу runfile. Він підкаже вам про кожну частину встановлення, і ви можете відключити GLбібліотеки та набори інструментів. Центр контролю єдності також задає мені проблеми, пов'язані з необхідністю використовувати зразок CUDA libGLU.soзамість libGL.so. Це просте виправлення під час створення власних прикладів навчання.


1

Спробуйте видалити драйвер nvidia та безпосередньо встановити cuda без нього. У свіжому Ubuntu 14.04 я дотримувався вказівок із веб-сайту nvidia . Крім перевірки сумісних версій речей (gcc, ядро), інструкції були такими:

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

На щастя, правильний драйвер nvidia був встановлений як побічний продукт вищезазначених кроків.


1

Я провів цілий день, прагнучи використати " ppa: graphics-drivers / ppa ", щоб оновити драйвери NVIDIA до версії 352. Все не вдалося. Після одного встановлення gpu-manager.log повідомив, що драйвери встановлені, а Xorg.0.log повідомить про зворотне.

Драйвер nouveau було видалено та переведено у чорний список: sudo apt-get --purge delete xserver-xorg-video-nouveau cat /etc/modprobe.d/nouveau-nomodeset-jsrobin.conf чорний список nouveau options nouveau modeset = 0 псевдонім nouveau off alias lbm-nouveau off

Нарешті я відмовився і застосував суто рішення "NVIDIA ... бін".

  1. Нуво в чорний список, як показано вище.
  2. повністю видалив модерн Xserver, як це було зазначено вище.
  3. Встановіть біосистему системи, щоб PCIe (дві карти nvidia) були первинними та відключили інтерфейс материнської плати HD4600.
  4. завантажився в режим відновлення, активував мережу, потім перейшов у консольний режим.
  5. Побіг "NVIDIA-Linux-x86_64-352.41.run -uninstall", щоб переконатися, що нічого не залишилося.
  6. Видалено будь-які старі каталоги в / etc, / usr / local, які були схожими на залишки минулих установок cuda або nvidia.
  7. Ran "NVIDIA-Linux-x86_64-352.41.run"
  8. Побіг "NVIDIA-Linux-x86_64-352.41.run - перевірити", щоб перевірити, чи все було правильно (це було).
  9. Потім запустіть "cuda_7.5.18_linux.run", щоб завершити встановлення. Наразі справи працюють. Обидва монітори працюють і працюють. В даний час працює над створенням файлів зразків cuda. Обов’язково використовуйте прапорці "--help" на бункерах для встановлення NVIDIA. Основна причина, що я вирішив пройти шлях біна (разом з однією з альтернатив, яка не працює, полягає в тому, що підхід "бін" забезпечує простий шлях до відновлення після оновлення OpenGL "меса". Результат

1

Я перезавантажив Ubuntu сьогодні, і виявив, що існує ще одна невлаштована залежність на зразок libcog15 : Depends: mesa-driver...(я не можу згадати повну назву пакета), тому я використовував apt-get installдля установки "меса-драйвер". Після цього CUDA 7.5 успішно встановлений.

Зауважте, що моя версія ядра є загальною 3.19.0-28, а версія gcc - Ubuntu 4.8.4-2ubuntu1 ~ 14.04 , що не знайдено в офіційних документах CUDA 7.5 . Я перевірю, чи справді це працює.


1
Чомусь драйвер mesa на моєму комп’ютері викликав усілякі проблеми єдності під час завантаження і спричинив повний збій у моїй системі. Будь обережний.
asdf

@Bruce Yo - це взагалі не лише питання меса, це залежить від чіпсетів на гібридних nvidia-graphics-картах, які всі різні. Ви також повинні розглянути моє рішення. : o)
dschinn1001

0

Я спробував sudo su і apt-get install cuda замість sudo 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, приємно бачити, що ви ділитесь знаннями. Однак це не форум, це веб-сайт із запитаннями та відповідями, перегляньте цю довідкову екскурсію . Копіювання відповіді інших (з 661266 користувачів) не допомагає, ви зможете проголосувати, коли отримаєте достатню репутацію.
user.dz

@Sneetsher Дякую за ваш коментар. Я спробував відповісти 661266 користувача, але це не вийшло. Коли я використовував "su" замість "sudo", це спрацювало. Я не знаю чому саме. Однак це спрацювало з моїм випробуванням. Я вважаю, що комусь варто спробувати моє рішення.
softgearko

0

Зверніться до: https://github.com/astorfi/Caffe_Deep_Learning/blob/master/Installation/readme.md . Він по суті пов'язаний з встановленням Caffe, але він також стосується установки CUDA.


1
Привіт @amirsani_torfi, ласкаво просимо до ask.ubuntu. Зауважте, що, хоча ваше посилання може надавати інформацію, необхідну для вирішення заданого питання, посилання можуть бути видалені в будь-який час. Я б запропонував вам замість цього відредагувати своє запитання, щоб включити важливу інформацію із цього посилання.
Цилідзі Мудау

-1

-проблеми з входом lightdm (цикл входу)

-проблеми з драйвером istall ("Установка драйвера не вдалася: виявляється, що X-сервер працює ...")

Щоб успішно встановити інструментарій NVidia CUDA на Ubuntu 16.04 64bit я тільки що повинен був зробити:

  1. зробити liveImage Ubuntu на Pendrive (достатньо ручки 8 ГБ) - така спроба заощадить тонну нервів до невдалої установки на вашій системі Linux !!!
  2. увійдіть на пряму сесію в pendrive ("Спробуйте Ubuntu, перш ніж встановити")
  3. додати користувача sudo під час сеансу наживо:

    sudo adduser admin (#pass: admin1)

    sudo usermod -aG sudo адміністратор

  4. вихід із прямого сеансу, увійдіть як #admin

  5. завантажити інструментарій CUDA з офіційного сайту NVidia (~ 1,5 ГБ)
  6. змінити привілеї для завантаженого файла інсталятора (НЕ ВСТАВЛЯЙТЕ НА ЦЬОМУ
    КРОКІ !): sudo chmod + x cuda_X.X.run

  7. перехід на консольний вигляд:

    Ctr + Alt + F1 (для переключення на перегляд терміналу) Ctr + Alt + F7 (для переходу з подання терміналу на графічний сервер)

  8. при перегляді консолі (Ctr + Alt + F1) увійдіть:

    логін: адміністративний пропуск: admin1

  9. зупинити графічну роботу служби:

    Служба судо

  10. перевірте, чи графічний сервер вимкнено - після перемикання Ctr + Alt + F7 монітор повинен бути порожнім чорним, поверніть на консольний вигляд Ctr + Alt + F1

  11. встановіть інструментарій CUDA з такою конфігурацією:

    sudo ./cuda_X.X.run (натисніть "q" для пропуску читання ліцензії) не встановлюйте бібліотеку OpenGL, не оновлюйте конфігурацію системи X, інші параметри роблять так і шляхи за замовчуванням

  12. увімкніть графічний сервер:

    Судо сервіс lightdm start

  13. увійдіть як користувач (якщо ви автоматично входите як #ubuntu під час виходу із сеансу наживо):

    логін: адміністративний пропуск: admin1

  14. перевірте, що компілятор nvcc працює з наданою простою паралельною векторною сумою в блоках GPU:

    збережіть 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. якщо все пішло на живому сеансі pendrive, зробіть те ж саме у вашій системі Linux 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__
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.