两个线程,首先添加第二个子线程

时间:2014-03-25 14:58:37

标签: c pthreads

这是互斥锁的典型示例。我不知道为什么以下代码不起作用,即。它没有打印" ctr = 0"每次(但是,例如,ctr = 535)。

int ctr;
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

void * add (void * arg_wsk)
{
        int i;
        for (i = 0; i < 100000; i++) {
                pthread_mutex_lock (&m);
                ctr++;
                pthread_mutex_unlock (&m);
        }
        return(NULL);
}

void * sub(void * arg_wsk)
{
        int i;
        for (i = 0; i < 100000; i++) {
                pthread_mutex_lock (&m);
                ctr--;
                pthread_mutex_unlock (&m);
        }
        return(NULL);
}
int main()
{       
        pthread_t tid1, tid2;
        int i;
        void *res;
        ctr = 0;
        pthread_mutex_init(&m, NULL);

        pthread_create(&tid1, NULL, add, NULL);
        pthread_detach(tid1);

        pthread_create(&tid2, NULL, sub, NULL);
        pthread_detach(tid2);

        pthread_join(tid1, &res);
        pthread_join(tid2, &res);

        pthread_mutex_destroy(&m);
        printf("ctr = %d", ctr);
        pthread_exit(NULL);
}

2 个答案:

答案 0 :(得分:4)

我认为您滥用POSIX API。如果分离线程,则不应加入它们。删除分离,看看这是否有所改善。我想你会看到main()现在阻塞,直到线程完成。

另请注意,来自联接电话的链接

ESRCH  No  thread could be found corresponding to that specified by the
          given thread ID.

如果你很幸运,你会点击这个。如果你不幸运,会发生疯狂的事情。不要在同一个线程上混合分离和连接调用。

https://computing.llnl.gov/tutorials/pthreads/#Joining

答案 1 :(得分:1)

您的计数器ctr的值取决于完成其完整执行的两个线程。

根据pthread_detach(3)

  

一旦线程被分离,它就无法加入   pthread_join(3)或再次成为可加入的。

如果您从程序中删除pthread_detach来电,您将获得预期的输出。

另外,请考虑显式创建可连接(或分离)的线程以实现可移植性。