【问题标题】:Creating and managing threads with pthreads()使用 pthreads() 创建和管理线程
【发布时间】:2014-11-13 22:12:19
【问题描述】:

我在网上浏览了不同的 pthread 教程。 hereherehere 等等。但是有一个问题仍然没有得到解答,想知道是否有人可以澄清它。

问题:

  • 假设我想打印a b a b a b a b a。假设thread1 正在打印a 并且thread2 正在打印b。这意味着thread1 执行然后将控制权交给thread2。然后thread2 打印b 并将控制权交还给thread1,以此类推。在这种情况下,是否可以创建两个线程并在执行特定次数的循环内一次调用每个线程(使用线程 ID 或某些内置函数?)?或者我是否必须每次使用循环创建两个线程?

例如: 我应该这样做:

  create_thread1()
  create_thread2()
  for loop
      call thread1()
      call thread2

或者我应该这样做:

  for loop
      create_thread1() to do something
      create_thread2() to do something

编辑:我从问题中删除了部分细节,因为用户认为这是问题所在。

编辑:代码

void *func(void *arg){
    int i;
    while(i<30){

        printf("%s\n",(char *)arg);
        i++;
    }
    return 0;
}


int main(int argc, char *argv[]){

    pthread_t thread1, thread2;
    int rt1, rt2;
    rt1 = pthread_create(&thread1, NULL, &func, "a");
    rt2 = pthread_create(&thread2, NULL, &func, "b");

    sleep(1);
    return;
}

【问题讨论】:

  • 主函数中没有for循环。您只需创建 thread1thread2 并让它们运行。 thread1 有一个 for 循环打印 a 五次。 thread2 有一个 for 循环打印 b 四次。在执行for 循环的下一次迭代之前,每个线程使用彼得森算法等待另一个线程。
  • @user3386109 我不想打印aaaaabbbbb 我希望每个线程运行一次并将控制权移交给第二个线程
  • 这不是彼得森算法的重点。 Peterson 的重点是允许两个线程交替使用单个资源。 thread1 有一个重复五次的循环。每次循环时,thread1 都会打印一个 a,然后等待 thread2 运行。
  • @user3386109 我知道。完成后,我将添加一个计数器,作为两个线程之间的关键代码。如果他们有锁,每个人都会更新它。但这是第一阶段。将其视为分配限制。我想要一个有两个线程的循环,每个线程打印一个字符 a 或 b。循环应该打印例如 print 20 a b's。
  • i 在线程函数中未初始化。请改用for (i=0;i&lt;30;i++)。此外,您应该在main 的末尾使用pthread_join 而不是sleep。但未初始化的变量是更大的问题。

标签: c multithreading pthreads


【解决方案1】:

有一个全局变量 sum 并在 Thread1 中将 10 添加到 sum 1000 次并在 Thread2 中减去 5从 sum 1000 次。运行两个线程并查看输出。将出现竞态条件。彼得森的算法是为了避免竞争条件。 这里 sum += 10sum -= 5 是关键部分。现在实现 Peterson 算法并查看输出。

这是演示彼得森算法工作原理的最佳示例。

【讨论】:

  • 我将在我完成后立即执行彼得森算法。将问题视为作业限制。
【解决方案2】:

好的。所以我发现我的两个假设都是错误的。因为我假设创建的线程将被串行执行。但是在创建线程时,操作系统会随机并行执行线程。所以我实现如下:

create_thread1(call function1)
create_thread2(call function2)

function1(){
  loop
}

function1(){
  loop
}

A partial answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2017-10-17
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 2014-04-12
    • 2021-08-30
    相关资源
    最近更新 更多