我正在尝试使用二进制信号量解决读者的问题。
我期望的结果是我是writer2,数据是1。我是reader3,数据是2。
但是,结果是我是writer0,我是reader0 data1,data2〜data5。 如何修复我的代码?
int data = 0; // global variable.
void main()
{
//other code is omitted.
int i;
for(i=0; i<5; i++)
pthread_create(&w[i], NULL, writer, &i);
for(i=0; i<20; i++)
pthread_create(&r[i], NULL, reader, &i);
for(i=0; i<5; i++)
pthread_join(w[i], NULL);
for(i=0; i<20; i++)
pthread_join(r[i], NULL);
}
答案 0 :(得分:0)
您的问题出在传递给线程的参数上:它将变为快速以供您的线程使用。
一种解决方案是为每个线程创建一个参数:
int i;
for(i=0; i<5; i++)
{
int *par = malloc(sizeof *par);
*par = i;
pthread_create(&w[i], NULL, writer, par);
}
警告,由于已分配了一些内存,因此必须在以下位置将其释放:
void * writer(void *parameter)
{
int *par = (int*)parameter;
/* do some operation with *par */
printf("I'm thread %d\n", *par );
/* free it*/
free(par);
.... rest of function code ...
}
如果您对内存分配感到满意,则可以使用一些参数数组:
/* w array guessed from rest of code*/
thread_t w[5];
int par_w[5];
int i;
for(i=0; i<5; i++)
{
par_w[i] = i;
pthread_create(&w[i], NULL, writer, &par_w[i]);
}
答案 1 :(得分:0)
您的问题可能与 i 的值有关,该值没有正确的线程值,这有两个原因
首先,您没有同步,因此 main 可以在线程读取它之前更改 i 的值
第二次从本地线程的其他线程进行的访问没有保证:
C11草案标准n1570:6.2.4对象的存储持续时间5声明其标识符没有链接且没有存储类说明符static的对象具有自动存储持续时间,某些复合文字也是如此。尝试从与对象关联的线程之外的线程间接访问具有自动存储持续时间的对象的结果是实现定义的
所以它是分配内存并提供其地址的好方法,例如:
for(i=0; i<5; i++) {
int * p = malloc(sizeof(int));
*p = i;
pthread_create(&w[i], NULL, writer, p);
}
当然,创建的线程负责释放内存