小编Yar*_*eli的帖子

pthread_mutex_lock当它是同一个线程时如何不锁定

我正在使用pthread_mutex_t进行锁定.

pthread_mutex_t m_lock;

void get1() {
    cout<<"Start get 1"<<endl;
    pthread_mutex_lock(&m_lock);
    get2();
    pthread_mutex_unlock(&m_lock);
    cout<<"End get 1"<<endl;
}

void get2() {
    cout<<"Start get 2"<<endl;
    pthread_mutex_lock(&m_lock); // The program actually stops here because it waits to m_lock to be unlock from get1 function.
    pthread_mutex_unlock(&m_lock);
    cout<<"End get 2"<<endl;
}

// The thread call to run function
void* run(void* p) {
    get1();
}
Run Code Online (Sandbox Code Playgroud)

假设我只有一个调用run函数的线程,所以:get1锁定m_lock并调用get2,但是当它试图锁定m_lock时,它等待锁定将被解锁(某些事情没有发生)我们得到了一个僵局.

我的问题是,当在get1中锁定锁的同一个线程不需要等待get2中的锁(因为它是同一个线程)时,我怎么能避免这种情况?

例如,在Java中,当您使用synchornized时,这种情况永远不会发生.

public Test implements Runnable {
    public void get1() {
        System.out.println("Start get 1");
        synchronized (this) {
            get2();
        }
        System.out.println("End get …
Run Code Online (Sandbox Code Playgroud)

c c++ multithreading mutex

8
推荐指数
1
解决办法
813
查看次数

Makefile 不检查头文件中的更新

我认为我的 makefile 非常好,但后来我尝试仅更新头文件并重新编译我的库,但它没有改变任何内容。

我怎样才能让它工作并重新编译 h 文件中的代码。

我的生成文件:

SHELL = /bin/sh
SOURCE_FILES_DIRS = -I./../frmwrk/ -I./../Utils/
CXX = g++
CXXFLAGS = $(SOURCE_FILES_DIRS) -std=c++17 -rdynamic -fPIC -g -Wall
LDFLAGS = -shared

LIBS_DIR = ../../libs/
LIB_NAME = libIni.so
TARGET  = $(LIBS_DIR)$(LIB_NAME)
SOURCES = $(shell echo *.cpp)
HEADERS = $(shell echo *.h)
OBJECTS = $(SOURCES:.cpp=.o)
LINK_LIBS = -lFrmwrk -lUtils

PREFIX = $(DESTDIR)/usr/local
BINDIR = $(PREFIX)/bin

all: $(TARGET)

$(TARGET): $(OBJECTS) $(HEADERS)
    $(CXX) $(CXXFLAGS) -L$(LIBS_DIR) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(HEADERS) $(LINK_LIBS)

clean:
    rm -f *.o $(TARGET)/*.so
    rm …
Run Code Online (Sandbox Code Playgroud)

c++ makefile compilation header-files

5
推荐指数
1
解决办法
1265
查看次数

如何用 Ninja 编译 C++ 中的“Hello World”?

我是忍者新手。还是不知道怎么用。

我创建了一个简单的hello.cpp文件:

#include <iostream>
int main()
{
        std::cout << "Hello World!" << std::endl;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Linux Ubuntu。

我已经安装了 CMake:apt install cmake

我已经安装了忍者:apt-get install ninja-build

但现在我应该怎么做才能用hello.cppNinja 编译我的文件呢?

我尝试运行ninja,但出现以下错误rules.ninja

ninja: error: build.ninja:30: loading 'rules.ninja': No such file or directory
Run Code Online (Sandbox Code Playgroud)

我不知道如何创建rules.ninja和如何配置它,也不知道我是否错过了更多的东西。

c++ makefile compilation cmake ninja

2
推荐指数
1
解决办法
4307
查看次数

标签 统计

c++ ×3

compilation ×2

makefile ×2

c ×1

cmake ×1

header-files ×1

multithreading ×1

mutex ×1

ninja ×1