程序中的两个线程交替打印偶数和奇数,直到100。我试过了,它起作用了。有没有办法访问main内部共享数据的值,并在值达到100时终止这两个线程
#include<stdio.h>
#include<pthread.h>
pthread_t tid[2];
unsigned int shared_data = 0;
pthread_mutex_t mutex;
unsigned int rc;
//prototypes for callback functions
void* PrintEvenNos(void*);
void* PrintOddNos(void*);
void main(void)
{
pthread_create(&tid[0],0,&PrintEvenNos,0)
pthread_create(&tid[1],0,&PrintOddNos,0);
sleep(3);
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
}
void* PrintEvenNos(void *ptr)
{
pthread_mutex_lock(&mutex);
do
{
if(shared_data%2 == 0)
{
printf("Even:%d\n",shared_data);
shared_data++;
} else {
rc=pthread_mutex_unlock(&mutex);//if number is odd, do not print, release mutex
}
} while(shared_data <= 100);
}
void* PrintOddNos(void* ptr1)
{
rc = pthread_mutex_lock(&mutex);
do
{
if(shared_data%2 != 0)
{
printf("odd:%d\n",shared_data);
shared_data++;
} else {
rc = pthread_mutex_unlock(&mutex);//if number is even, do not print, release mutex
}
} while(shared_data <= 100);
}
7条答案
按热度按时间qhhrdooz1#
58wvjzkj2#
有几个错误,在我之前发布的代码中,我纠正了这些错误,这个程序打印从0到100的偶数和奇数值,我已经试过了。
yiytaume3#
dsekswqp4#
ccrfmcuu5#
这是一个非常糟糕的线程用例。让两个线程简单地交替工作负载不会给你带来任何好处。一般的想法是允许线程在等待某些资源可用的同时做 * 其他 * 工作。
如果您的两个线程要么正在执行有用的工作,要么在等待有用的工作变得可用时什么也不做,那么最好在单个执行线程中执行这些工作。
话虽如此,你 * 可以 * 将工作量划分成线程,但你的做法是有问题的。首先,你的每个线程只处理 * 一个 * 数字,然后退出,所以你不会得到接近一百个数字的打印输出。
其次,即使它们确实循环了,每一行都像:
将 * 递增 * 共享数据,即使它不应该这样做。这将导致在输出中产生"有趣"的结果。考虑一下这样的情况:每个线程在切换到另一个线程之前都经历了循环的多次迭代。
因为它是递增的,* 而不管 * 当前值,所以您可能会看到类似这样的内容:
线程的伪代码要求每个线程在轮到自己之前不做任何事情来影响数据。首先是主线程,与你的线程没有太大区别:
然后是两个工作线程,结构非常相似:
但是,即使您希望以线程化的方式完成此操作,互斥也不一定是一种好的方式。(上述伪代码中的收益是减轻这一点的努力,但是我非常确定pthreads并不强制
yield
--它可能是一个不可移植的扩展)。有更好的(即确定性的)方法来实现线程之间的通信,这些方法 * 知道 * 控制权必须被转移,比如条件变量。
sczxawaw6#
fcy6dtqo7#
下面是c代码打印偶数和奇数使用两个线程,与发送信号给其他线程一旦第一个线程完成,使第二个线程备份和开始使用资源.下面的程序是工作正常!!!