【发布时间】:2018-02-02 17:11:01
【问题描述】:
我正在尝试对 2 个进程进行严格的交替,但我不确定如何声明关键区域和非关键区域。这是我的代码:
#include <iostream>
#include <pthread.h>
int count;
int turn = 0; // Shared variable used to implement strict alternation
void* myFunction(void* arg)
{
int actual_arg = *((int*) arg);
for(unsigned int i = 0; i < 10; ++i) {
while(1)
{
while(turn != 0)
{
critical_region_0();
turn = 1;
non_critical_region_0();
}
}
// Beginning of the critical region
count++;
std::cout << "Thread #" << actual_arg << " count = " << count <<
std::endl;
// End of the critical region
while(0)
{
while(turn != 1)
{
critical_region_1();
turn = 0
non_critical_region_1();
}
}
}
pthread_exit(NULL);
}
int main()
{
int rc[2];
pthread_t ids[2];
int args[2];
count = 0;
for(unsigned int i = 0; i < 2; ++i) {
args[i] = i;
rc[i] = pthread_create(&ids[i], NULL, myFunction, (void*) &args[i]);
}
for(unsigned int i = 0; i < 2; ++i) {
pthread_join(ids[i], NULL);
}
std::cout << "Final count = " << count << std::endl;
pthread_exit(NULL);
}
我知道关键区域和非关键区域的写法好像它们是一种方法,但我将它们用作占位符。有没有办法在不使用这些方法的情况下进行严格交替?
这是输出的样子。
Thread #0 count = 1
Thread #1 count = 2
Thread #0 count = 3
Thread #1 count = 4
Thread #0 count = 5
Thread #1 count = 6
Thread #0 count = 7
Thread #1 count = 8
Thread #0 count = 9
Thread #1 count = 10
Thread #0 count = 11
Thread #1 count = 12
Thread #0 count = 13
Thread #1 count = 14
Thread #0 count = 15
Thread #1 count = 16
Thread #0 count = 17
Thread #1 count = 18
Thread #0 count = 19
Thread #1 count = 20
Final count = 20
我只能设法得到的输出首先是线程 1,然后是线程 0。
【问题讨论】:
-
是的,您可以使用 std::atomic_flag::test_and_set 代替,但它适用于同一进程上的不同线程。顺便说一句,您的问题标题为“字符串”交替而不是严格,并且您还混合了进程和线程的术语。它们是两种不同的东西。
-
貌似是XY问题,为什么需要线程这样工作?
-
@Slava 我需要它像这样工作,以便我可以学习如何实现严格交替。我没有意识到我的问题是字符串交替,我意识到它们是两个不同的东西。
-
是的,但问题是您需要“严格交替”来做什么。对我来说看起来像无用的范例。
标签: c++ multithreading aws-cloud9