mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-28 20:44:26 +01:00
cpp: parametrize nthreads on threaded programs CLI
Mark them as multithreaded in path_properties. Preparation for https://cirosantilli.com/linux-kernel-module-cheat/#user-mode-static-executables-with-dynamic-libraries which is likely what breaks gem5 on them.
This commit is contained in:
@@ -515,12 +515,14 @@ path_properties_tuples = (
|
|||||||
'gem5_unimplemented_instruction': True,
|
'gem5_unimplemented_instruction': True,
|
||||||
},
|
},
|
||||||
'count.cpp': {'more_than_1s': True},
|
'count.cpp': {'more_than_1s': True},
|
||||||
# Need to pass -lstdc++fs but we don't have a mechanism
|
|
||||||
# to test the GCC version and only pass if >= 7.
|
|
||||||
'temporary_directory.cpp': {'no_build': True},
|
|
||||||
'sleep_for.cpp': {
|
'sleep_for.cpp': {
|
||||||
'more_than_1s': True,
|
'more_than_1s': True,
|
||||||
},
|
},
|
||||||
|
# Need to pass -lstdc++fs but we don't have a mechanism
|
||||||
|
# to test the GCC version and only pass if >= 7.
|
||||||
|
'temporary_directory.cpp': {'no_build': True},
|
||||||
|
'thread_get_id.cpp': {'test_run_args': {'cpus': 2}},
|
||||||
|
'thread_return_value.cpp': {'test_run_args': {'cpus': 2}},
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
'gcc': (
|
'gcc': (
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
//
|
//
|
||||||
// On Ubuntu 19.04, they ar large possibly non-consecutive numbers.
|
// On Ubuntu 19.04, they ar large possibly non-consecutive numbers.
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
@@ -12,15 +13,30 @@
|
|||||||
std::mutex mutex;
|
std::mutex mutex;
|
||||||
|
|
||||||
void myfunc(int i) {
|
void myfunc(int i) {
|
||||||
|
// Mutex and flush to prevent the output from
|
||||||
|
// different threads from interleaving.
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
std::cout << i << " " << std::this_thread::get_id() << std::endl;
|
std::cout <<
|
||||||
|
i << " " <<
|
||||||
|
std::this_thread::get_id() << std::endl
|
||||||
|
<< std::flush;
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main(int argc, char **argv) {
|
||||||
std::cout << "main " << std::this_thread::get_id() << std::endl;
|
std::cout << "main " << std::this_thread::get_id() << std::endl;
|
||||||
std::vector<std::thread> threads;
|
std::vector<std::thread> threads;
|
||||||
for (unsigned int i = 0; i < 4; ++i) {
|
unsigned int nthreads;
|
||||||
|
|
||||||
|
// CLI arguments.
|
||||||
|
if (argc > 1) {
|
||||||
|
nthreads = std::strtoll(argv[1], NULL, 0);
|
||||||
|
} else {
|
||||||
|
nthreads = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Action.
|
||||||
|
for (unsigned int i = 0; i < nthreads; ++i) {
|
||||||
threads.push_back(std::thread(myfunc, i));
|
threads.push_back(std::thread(myfunc, i));
|
||||||
}
|
}
|
||||||
for (auto& thread : threads) {
|
for (auto& thread : threads) {
|
||||||
|
|||||||
@@ -20,10 +20,23 @@ void myfunc_reference(int& i) {
|
|||||||
i = myfunc(i);
|
i = myfunc(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main(int argc, char **argv) {
|
||||||
unsigned int nthreads = 4;
|
unsigned int nthreads;
|
||||||
std::vector<int> inputs{1, 2, 3, 4};
|
|
||||||
std::vector<int> outputs_expect{2, 3, 4, 5};
|
// CLI arguments.
|
||||||
|
if (argc > 1) {
|
||||||
|
nthreads = std::strtoll(argv[1], NULL, 0);
|
||||||
|
} else {
|
||||||
|
nthreads = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup inputs and expected outputs.
|
||||||
|
std::vector<int> inputs;
|
||||||
|
std::vector<int> outputs_expect;
|
||||||
|
for (unsigned int i = 0; i < nthreads; ++i) {
|
||||||
|
inputs.push_back(i);
|
||||||
|
outputs_expect.push_back(myfunc(i));
|
||||||
|
}
|
||||||
|
|
||||||
// future and sync. Nirvana. When you are not fighting to death with types:
|
// future and sync. Nirvana. When you are not fighting to death with types:
|
||||||
// https://stackoverflow.com/questions/10620300/can-stdasync-be-use-with-template-functions
|
// https://stackoverflow.com/questions/10620300/can-stdasync-be-use-with-template-functions
|
||||||
|
|||||||
Reference in New Issue
Block a user