Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions 4_threads/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
cmake_minimum_required(VERSION 3.16)

project(4_threads)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

file(GLOB project_src "*.cpp" "*.hpp")

add_executable(4_threads ${project_src})
76 changes: 76 additions & 0 deletions 4_threads/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#include <iostream>
#include <thread>
#include <fstream>
#include <string>
#include <mutex>
#include <csignal>

const int kBufferSize = 10;

struct Buffer {
char data[kBufferSize];
bool is_full;
};

std::thread first;
std::thread second;
std::mutex mtx;
Buffer buffer;
std::ifstream file("textfile.txt");

void SignalHandler(int signum){
std::cout << "Interrupt signal (" << signum << ") received.\n";
first.join();
second.join();
std::cout << "Program gracefully finished!";
exit(signum);
}

void FirstThreadFunction(){
std::cout << "[log]: thread1 function entrance" << std::endl;
while(!file.eof()){
mtx.lock();
if(buffer.is_full){
mtx.unlock();
continue;
}
file.read(buffer.data, kBufferSize);
buffer.is_full = true;

mtx.unlock();
}
std::cout << "[log]: thread1 function exit" << std::endl;
}

void SecondThreadFunction(){
std::cout << "[log]: thread2 function entrance" << std::endl;
bool last_buff_read = false;
while(!last_buff_read){
mtx.lock();
if(file.eof()){
last_buff_read = true;
}
if(buffer.is_full){
for(auto &c: buffer.data){
std::cout << c;
}
std::cout << std::endl;
buffer.is_full = false;
}
mtx.unlock();
}
std::cout << std::endl;
std::cout << "[log]: thread2 function exit" << std::endl;
}

int main(){
if(!file.is_open()){
return 1;
}
first = std::thread(FirstThreadFunction);
second = std::thread(SecondThreadFunction);
std::signal(SIGINT, SignalHandler);
first.join();
second.join();
return 0;
}