Кто-нибудь успешно установил 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 Downloads я пытаюсь установить его, но получается результат, как показано ниже:

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 только что установлена ​​и произвела обновления программного обеспечения и установила последнюю версию драйвера 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 Toolkit + Driver
    • Скажи ДА установке образцов 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. Снова включите 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 (ноутбук 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 и других встроенных графических чипсетов на гибридных материнских платах) - первый, описанный здесь, является самым простым, а второй - более громоздким, но также эффективным:

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 более скромный и может быть рискованным, но не вредным. :

Как я могу установить Nvidia Driver 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 / Bumblebee в 14.04


1

Звучит как ошибка ЛП 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, kernel), инструкции были:

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 remove xserver-xorg-video-nouveau cat /etc/modprobe.d/nouveau-nomodeset-jsrobin.conf черный список параметров nouveau nouveau modeset = 0 псевдоним nouveau off alias лбм нуво выкл

Я, наконец, сдался и использовал чисто «NVIDIA ... bin» решение.

  1. Черный список нуво, как показано выше.
  2. полностью удалил Nouveau Xserver, как указано выше.
  3. Установите системный BIOS, чтобы PCIe (две карты NVIDIA) был основным, и деактивировал интерфейс 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. Обязательно используйте флаги --help в установочных корзинах NVIDIA. Основная причина, по которой я решил пойти по пути bin (наряду с одной из альтернатив, которая не работает), заключается в том, что подход «bin» обеспечивает легкий путь к восстановлению после обновления «mesa» OpenGL. Результат

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
По какой-то причине драйвер mesa на моем компьютере вызывал всевозможные проблемы с единством при загрузке и приводил к полному отказу моей системы. Быть осторожен.
asdf

@ Брюс Йо - В общем, дело не только в мезе, это зависит от чипсетов на гибридных видеокартах nvidia, которые все разные. Вы должны рассмотреть мое решение тоже. : o)
dschinn1001,

0

Я попробовал sudo su и apt-get установить 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

Добро пожаловать в Спросите 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 Toolkit на 64-битной Ubuntu 16.04, мне просто нужно было сделать следующее:

  1. сделайте liveImage Ubuntu на pendrive (достаточно 8GB пера) - такая попытка сэкономит массу нервов перед неудачной установкой на ваш хост Linux!
  2. войти в систему в режиме реального времени на Pendrive («Попробуйте Ubuntu, перед установкой»)
  3. добавить пользователя sudo в сеансе live:

    Администратор sudo adduser (#pass: admin1)

    sudo usermod -aG sudo admin

  4. Выйти из сеанса в реальном времени, войдите как #admin

  5. скачать CUDA Toolkit с официального сайта NVidia (~ 1,5 ГБ)
  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, не обновляйте конфигурацию системы X, другие параметры по умолчанию принимают значение yes и пути

  12. включить графический сервер:

    sudo service 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 live, сделайте то же самое на вашей системе 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.