linux系统下,c语言pthread多线程编程传参问题
3个线程使用的都是同一个info
代码 Info_t *info = (Info_t *)malloc(sizeof(Info_t));只创建了一个info
pthread_create(&threads[i],NULL,calMatrix,(void *)info); 三个线程使用的是同一个
我把你的代码改了下:
#include 《stdio.h》
#include 《stdlib.h》
#include 《pthread.h》
int mtc = { 0 }; // result matrix
typedef struct
{
int prank;
int *mta;
int *mtb;
}Info_t;
void* calMatrix(void* arg)
{
int i;
Info_t *info = (Info_t *)arg;
int prank = info-》prank;
fprintf(stdout,“calMatrix : prank is %d\n“,prank);
for(i = 0; i 《 3; i++)
mtc[prank] += info-》mta[i] * info-》mtb[i];
return NULL;
}
int main(int argc,char **argv)
{
int i,j,k = 0;
int mta;
int mtb = { 1 };
Info_t *info = (Info_t *)malloc(sizeof(Info_t)*3);
for(i = 0; i 《 3; i++)
for(j = 0; j 《 3; j++)
mta[i][j] = k++;
/* 3 threads */
pthread_t *threads = (pthread_t *)malloc(sizeof(pthread_t)*3);
fprintf(stdout,“\n“);fflush(stdout);
for(i = 0; i 《 3; i++)
{
info[i].prank = i;
info[i].mta = mta[i];
info[i].mtb = mtb;
pthread_create(&threads[i],NULL,calMatrix,(void *)(&info[i]));
}
for(i = 0; i 《 3; i++)
pthread_join(threads[i],NULL);
fprintf(stdout,“\n==== the matrix result ====\n\n“);
fflush(stdout);
for(i = 0; i 《 3; i++)
{
fprintf(stdout,“mtc[%d] = %d\n“,i,mtc[i]);
fflush(stdout);
}
return 0;
}
矩阵的计算我忘记了,你运行看看结果对不对
c语言怎样保留两位小数
C语言怎么保留两位小数,如果不定义的话,那么就会默认不是两位小数,那么需要输出内容保留小数,实际上可以对浮点型进行设置的。
1、首先打开IDE,接着保存main.c文件。
2、这个时候把内容输出,设置浮点型。也就是%f。
3、但是输出的时候默认有多位小数。
4、这时可以设置%.2f,也就是两位数,因为我们写了2。
5、这个时候执行代码的时候就会看到只有两位小数了。
C# 如何将通过反射获得的 MethodInfo 类添加到 Dictionary 中
我不是很了解你的用意,不过你 试试看这个能不能给你思路!
但是我觉得你那一样反射去做的话就会造成所有的待用都只能调用到最后一个函数,因为你的委托只有一个,反射也是委托,你改变其中的一个,其他都会跟着变,结果就是public viod myProc_1(byte data) 被调用,其他的都调用不了,所以你的代码需要改造 如下-语言
声明dic:
Dictionary《int, MethodInfo》 Func = new Dictionary《int, MethodInfo》()
反射,假如你的方法在Demo类中,反射添加如下
try
{
Demo demo = new Demo();
MethodInfo methods = demo.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
//获取想要的方法集合,“myProc“是方法查找关键字
int i = 0;
foreach (MethodInfo t in methods.Where(F =》 F.Name.Contains(“myProc“)))
{
Func.Add(i,t);
i++;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}-th
调用: 非静态方法
demo = new Demo();
Func.Invoke(demo, new object { new byte });
Func.Invoke(demo, new object { new byte });-语言
如果是静态的方法
Func.Invoke(null, new object { new byte });
Func.Invoke(null, new object { new byte });-th
就这样...