1. 程式人生 > >C++筆記(一)

C++筆記(一)

一.C++延時與暫停

windows下:

#include<Windows.h>
...
Sleep(500);//500ms
...
system("pause");
...

Linux下:

#include<unistd.h>
...
sleep(0.5);//0.5s
...
pause();
...

二.多執行緒CMakeLists.txt配置

cmake_minimum_required(VERSION 3.10)
project(untitled2)
find_package(Threads REQUIRED)
set(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11 -pthread")

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_THREAD_LIBS_INIT})

三.多執行緒入門

參考:多執行緒入門

ps:執行緒初始化:

使用類物件(初始化執行緒,考慮運算子過載,std::thread t(task)中的task相當於task.operator()

std::thread t(task(i))中的task相當於task.operator()(i)

#include <iostream>
#include <thread>
class Task
{
public:
    void operator()(int i)
    {
        cout << i << endl;
    }
};

int main()
{
    
    for (uint8_t i = 0; i < 4; i++)
    {
        Task task;
        thread t(task, i);//等價於thread t(task(i))
        t.detach(); 
    }
}

注意:把函式物件傳入std::thread的建構函式時,要注意一個C++的語法解析錯誤(C++'s most vexing parse)。向std::thread的建構函式中傳入的是一個臨時變數,而不是命名變數就會出現語法解析錯誤。如下程式碼:

std::thread t(Task(),i);

這裡相當於聲明瞭一個函式t,其返回型別為thread,而不是啟動了一個新的執行緒。可以使用新的初始化語法避免這種情況:

std::thread t{Task(),i};
//或者
std::thread t((Task()),i);