blog

C++mulThread

线程与进程之间的关系
线程的创建
线程传参
线程间通信
线程数据竞争
线程死锁
lock_guard()—RAII—解决线程挂掉后没有解锁的情况
unique_lock能够使用move

以下3种对象都可以传进线程
– A function pointer
– A function object
– A lambda expression

// CPP program to demonstrate multithreading 
// using three different callables. 
#include <iostream> 
#include <thread> 
using namespace std; 

// A dummy function 
void foo(int Z) 
{ 
    for (int i = 0; i < Z; i++) { 
        cout << "Thread using function"
            " pointer as callable\n"; 
    } 
} 

// A callable object 
class thread_obj { 
public: 
    void operator()(int x) 
    { 
        for (int i = 0; i < x; i++) 
            cout << "Thread using function"
                " object as callable\n"; 
    } 
}; 

int main() 
{ 
    cout << "Threads 1 and 2 and 3 "
        "operating independently" << endl; 

    // This thread is launched by using 
    // function pointer as callable 
    thread th1(foo, 3); 

    // This thread is launched by using 
    // function object as callable 
    thread th2(thread_obj(), 3); 

    // Define a Lambda Expression 
    auto f = [](int x) { 
        for (int i = 0; i < x; i++) 
            cout << "Thread using lambda"
            " expression as callable\n"; 
    }; 

    // This thread is launched by using 
    // lamda expression as callable 
    thread th3(f, 3); 

    // Wait for the threads to finish 
    // Wait for thread t1 to finish 
    th1.join(); 

    // Wait for thread t2 to finish 
    th2.join(); 

    // Wait for thread t3 to finish 
    th3.join(); 

    return 0; 
} 

对于下面的将对象传入线程则会造成语法上的义:

class obj
{
public:
void operator()()
{
dosomething();
}
}
int main()
{
//std::thread my_thread(obj());//syntax errro;编译器会认为是你申明了一个带参(这个参数是一个无参的函数)的函数,这个函数返回一个std::thread的类型,而非会启动一个线程,为了解决这个语法歧义问题,可以用下面的方法
//std::thread my_thread((obj()));
或
//std::thread my_thread{obj()};
也可以传入lmada
std::thread my_thread(
[](){dosomething()};
)
}

防止死锁的方法之一:在二个线程中要以相同的次序获得硕

T20 C++ multithreading mistskes and how to avoid them

https://www.acodersjourney.com/top-20-cplusplus-multithreading-mistakes/

C++ Multithreading Tutorial via Q&A

https://www.acodersjourney.com/c11-multithreading-tutorial-via-faq-thread-management-basics/#q2

第二话,命令

远程服务器不润徐关机,只能重启
重启时应该关闭服务

所有者只有一个,
所有组也只有一个,
ls -lh —以long长human人性化显示

ls -a 看是否有隐藏文件
ls -lh 人性化显示所有文件
ls -ld 只显示目录
ls -i 显示目录下的节点

权限数字
r—-4
w—2
x—-1

对文件的r/w/x/权限和对目录的r/w/x/权限的区别


由上可知能够删除文件的前提不是说对file文件有权限,而是说对文件目录要有写权限,为文件有写权限,仅仅说是能对文件写,而对目录有写权限,才代表对目录中的文件可以删除,对文件的删除操作,要啃文件的父目录的权限

要想改变文件的权限,只有2个用户可以
1是所有者
2是root

ch0wn:而要想改变文件的所有者,只有root可以
chgrap 改变所有组
谁创建了文件谁就是文件的所有者
linux中默认创建的文件不具有可执行权限(X)
比如:
对于权限755 ,目录是 rwx r-x r-x
文件是 rW- r– r–
umask–查看缺省创建文件的权限

find命令
find -name filename–按名字查找
find -mmin -60—按时间查找
find -user root–按所有者查找
find -type 按文件类型查找
find -inum 按文件节点查找

帮助命令
man+ [想要查询命令]
看这个命令是做什么用的
看这个命令某个选是做什么用的
man 查看配置文件查看2个方面
一,这个配置文件干什么用的
二,这个配置文件的格式;

man 查看帮助我文档
man 1 passwd 查看命令的帮助
man 5 passwd 配置文件的帮助

简单查看文件
whatis +命令
apropos+配置文件名称

查看主要用的命令选项
命令+–help

info+命令
help+命令查看shell内置命令的帮助

用户管理命令
useradd
passwd +用户名更改一个密码
root可以更改任何用户的密码
who查看登录用户

压缩
gzip—–.gz(gzip不保留源文件)
gunzip—-解压
gzip只能压缩文件,不能压缩目录
tar打包,可以打包目录

对目录先打包,在压缩
tar -zcf japan.tar.gz japan
对目录先解包,在解压缩
tar -zxvf japan.tar.gz

zip压缩保留源文件,可以压缩目录
unzip

网络命令
mail +用户,给用户发送信息
last 查看之前所有登录用户的登录信息
tcp 类似打电话(打电话,对方接到后再发)
udp 类似发短息(不管你在不在都发)

netstat -tlun 查看本机监听了那些端口

linux番—第一话,文件分区

https://mirrors.tuna.tsinghua.edu.cn/centos/6.10/isos/i386/
centos6 要想启用图形界面,最小内存为628MB

分区–格式化–设置文件名—分配盘符
linux分区(把大柜子分成小柜子)
主分区:最多4个
扩展分区:
不能格式化,写入数据
格式化的目的是写入文件系统(写入文件系统是把硬盘写分成一个一个等大小的数据块,再给每个数据块建立一个ID列表)
分区设备文件名、/dev/sda1(SATA硬盘接口)
逻辑分区永远从5开始
挂载:给每个分区提供一个挂载点(必须是目录)
硬件的设备文件名和文件联系起来就是挂载
在windows中分配盘符的过程就相对于挂载
分区,硬盘,linux自动挂载
U盘,软盘,光盘,移动硬盘在插入后必须手动挂载。

必须分区
/(根分区)
swap分区
推荐分区
boot分区(启动资源)
文件系统结构

从文件系统中看,往/boot,/etc,/home中写入数据就是往根目录/中写入
从硬盘上看,往、/boot中写数据就是往/dev/sda1盘写,往/home中写数据就是往/dev/sda2中写数据

远程文件工具
winscp文件考贝工具
sercurCRT

linux所用内容都是文件
linux不靠扩展名区分文件类型