• Как работает std::mutex на низком уровне?

    @MiiNiPaa
    На самом низком уровне синхронизация делается при помощи атомарных инструкций процессора. Скажем, модно использовать атомарную операцию обмена, чтобы записать в ячейку 1. Если предыдущее значение было 0, то мы теперь владеем каким-либо ресурсом, если там 1, то его уже занял кто-то другой и нужно попробовать снова позже.

    На более высоком уровне обычно в дело вступает ОС. Так как процессы изолированы друг от друга и не могут взаимодействовать напрямую, необходимо посредничество операционной системы. Как это сделано, зависит от системы. Выберите конкретную и гуглите:
    Вопрос на StackOverdlow
    linux.die.net/man/2/futex
    To reiterate, bare futexes are not intended as an easy-to-use abstraction for end-users. Implementors are expected to be assembly literate and to have read the sources of the futex user-space library referenced below.

    Исходники pthread (Который используется для реализации std::tread, std::mutex, etc)

    EDIT: И не используйте lock/unlock напрямую. Оберните их в lock_guard.
    Ответ написан
    5 комментариев
  • Как отключить Cortana в Windows 10 Pro?

    @123459
    Административные шаблоны -> Компоненты Windows -> Найти
    разрешить использование Кортаны
    Ответ написан
    Комментировать
  • Почему webpack Can't resolve 'babel-loader'?

    dmc1989
    @dmc1989 Автор вопроса
    Вот все проблемы:
    1. Терминал атома мешал установке модулей
    2. Конфигурация вебпака должна быть следующей:
    module.exports = {
      entry: './main.js',
      output: {
        filename: 'build.js'
      },
      module: {
        rules: [{
          test: /\.js$/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['es2015', 'react']
            }
          }
        }]
      },
      resolve: {
        modules: ['node_modules'],
        extensions: [".js", ".json", ".jsx", ".css"]
      }
    }
    Ответ написан
    1 комментарий
  • Как "наследовать метод" golang?

    @s_kozlov
    package main
    
    
    import "fmt"
    
    type AnimalIntf interface {
    	Walk() AnimalIntf
    	Say() AnimalIntf
    }
    
    type Animal struct {
    	animal    AnimalIntf
    	Name string
    }
    
    type Rabbit struct {
    	Animal
    }
    
    
    // Animal
    func NewAnimal(name string) *Animal {
    	animal := new(Animal)
    	animal.animal = animal
    	animal.Name = name
    	return animal
    }
    
    //Метод Walk у каждого свой
    func (this *Animal) Walk() AnimalIntf {
    	fmt.Println("I walk", this.Name)
    	return this.animal
    }
    
    //Метод Say общий
    func (this *Animal) Say() AnimalIntf {
    	fmt.Println("Im Animal and my Name is", this.Name)
    	return this.animal
    }
    
    
    // Rabbit
    func NewRabbit(name string) *Rabbit {
    	rabbit := new(Rabbit)
    	rabbit.animal = rabbit
    	rabbit.Name = name
    	return rabbit
    }
    
    //Метод Walk изменяется для Rabbit и работает корректно
    func (this *Rabbit) Walk() AnimalIntf {
    	this.Animal.Walk()
    	fmt.Println("...and Jump")
    	return this.animal
    }
    
    
    func main() {
    
    	animal := NewAnimal("Зверь")
    	animal.Walk().Say().Walk()
    
    	fmt.Println("\n---------------------\n")
    
    	rabbit := NewRabbit("Кроль")
    	rabbit.Walk().Say().Walk()
    
    }

    примерно так, как вариант
    вывод:
    I walk Зверь
    Im Animal and my Name is Зверь
    I walk Зверь
    
    ---------------------
    
    I walk Кроль
    ...and Jump
    Im Animal and my Name is Кроль
    I walk Кроль
    ...and Jump
    Ответ написан
    Комментировать
  • Как побороть ошибку /usr/bin/ld: cannot find -lcrypto при компиляции?

    Chvalov
    @Chvalov Автор вопроса
    sudo apt-get install libssl-dev libcrypto++-dev
    Ответ написан
    Комментировать